【问题标题】:Canvas draw black screen before touch触摸前画布画黑屏
【发布时间】:2016-05-12 14:05:06
【问题描述】:

我想在触摸屏幕及其工作时画黑点,但是当我第一次启动活动时,屏幕是黑色的,触摸后是白色的。我想从一开始就是白色的。我该如何解决?这是我的代码:

package com.inveitix.android.clue.ui.views;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;

/**
 * Created by Tito on 3.2.2016 г..
 */
public class DrawingView extends SurfaceView {

    private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    Canvas canvas;
    int width;
    int height;
    private SurfaceHolder surfaceHolder;
    private WindowManager wm;


    public DrawingView(Context context) {
        super(context);
        init();
    }

    public DrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public DrawingView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        surfaceHolder = getHolder();
        wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.FILL);
        getScreenSize();
    }


    private void getScreenSize() {
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        width = size.x;
        height = size.y;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (surfaceHolder.getSurface().isValid()) {
                canvas = surfaceHolder.lockCanvas();
                canvas.drawColor(Color.WHITE);
                canvas.drawCircle(event.getX(), event.getY(), 10, paint);
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
        return false;
    }
}

【问题讨论】:

  • 您是否尝试为您的 DrawingView 设置背景?
  • 这段代码只能在onTouchEvent方法上画东西。

标签: android canvas


【解决方案1】:

在你的初始化方法中添加:

holder.addCallback(new SurfaceHolder.Callback() {
    public void surfaceDestroyed(SurfaceHolder holder) {
    }

    public void surfaceCreated(SurfaceHolder holder) {
        canvas = holder.lockCanvas();
        canvas.drawColor(Color.WHITE);
        holder.unlockCanvasAndPost(canvas);
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
});

【讨论】:

  • 引起:com.inveitix.android.clue.ui.views.DrawingView.onFinishInflate(DrawingView.java:55) 处的 java.lang.NullPointerException
  • 我假设您的表面支架为空。你在哪里设置你的surfaceHolder?
  • 在我打电话给onCreate() 时遇到init()
  • 哦,是的,SurfaceHolder 有一个 Callback (developer.android.com/intl/es/reference/android/view/…) 对象,您可以在它创建后立即在其中执行代码。所以使用回调并将代码移出 onFinishInflate
  • 你能给我举个例子吗?
【解决方案2】:

改变这个

paint.setColor(Color.BLACK);

paint.setColor(Color.WHITE);

【讨论】:

  • 又是第一个屏幕是黑色的,触摸后是白色的
【解决方案3】:

在你的 init() 中放这个 paint.setColor(Color.WHITE);

【讨论】:

  • 又是第一个屏幕是黑色的,触摸后是白色的
  • 尝试 init surfaceHolder.setBackgroundColor(Color.WHITE);
  • 我做到了并且工作正常,但触摸后我无法画点
  • 在 ontouch 中,您可以更改表面视图的颜色或白点颜色
  • 这就是我在onTouchEvent() 中所做的事情。但不工作
猜你喜欢
  • 2014-04-27
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多