android canvas的问题

老黑牛 2018-04-21 08:40:03
下面是我的自定义view的相关代码:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mCanvas = canvas;

mCanvas.drawOval(mCirRect, mCP);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mCP.setColor(mPressColor);
mCanvas.drawOval(mCirRect, mCP);//①
invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mCP.setColor(mNormalColor);
mCanvas.drawOval(mCirRect, mCP);//②
invalidate();
break;
default:
break;
}
return true;
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mCanvas = null;
}

一共两个activity,一个叫 A,一个叫 B。这个自定义view是放在B的布局文件里的,A的布局文件里只有一个button,我在A中,点击button启动B,然后点击我的自定义view,再按返回键回到A,结果在A的界面中出现了我的自定义view 。但是将上述代码中的标注①②的代码行注释掉一切正常,请问这是什么原因?
...全文
775 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
老黑牛 2018-04-23
  • 打赏
  • 举报
回复
ok,3ks.待我去读读源码。
键盘舞者113 2018-04-23
  • 打赏
  • 举报
回复
VIiew由measure测量大小,layout确定位置,draw绘画, draw会调用onDraw(Canvas canvas)方法,Canvas画布,你可当做BItmap一样的图像在内存的数据结构
老黑牛 2018-04-23
  • 打赏
  • 举报
回复
嗯,多谢。还有个问题: onDraw的入参Canvas指向的是谁?是谁调用的他?
键盘舞者113 2018-04-23
  • 打赏
  • 举报
回复
我使用你的代码的时候没有发生你那样的情况,我只发现你那个自定义View代码有一个错误,就是一点击当前Activity就崩溃,因为你自己吧Canvas保存下来,放在onTouch里绘画,我就这么说Canvas只能在onDraw函数里使用,其他位置不能使用,这相当于一个分配在内存里的地址,只有在onDraw对其开锁,其他函数关锁,不能访问
老黑牛 2018-04-22
  • 打赏
  • 举报
回复
public class Main3Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        Button btn = findViewById(R.id.submit_btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Main3Activity.this, Main2Activity.class);
                startActivity(intent);
            }
        });
    }
}
public class Main2Activity extends AppCompatActivity {
    private static final String TAG = "Main2Activity";

    private RecordButton btn;

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        btn = findViewById(R.id.camera_record_btn);
    }
}
老黑牛 2018-04-22
  • 打赏
  • 举报
回复
public class RecordButton extends FrameLayout implements View.OnTouchListener {
    private static final String TAG = "RecordButton";

    private Canvas mCanvas;
    private RectF mCirRect;
    private Paint mCP;
    private float mRingWidth;
    private int mNormalColor;
    private int mPressColor;

    public RecordButton(@NonNull Context context) {
        this(context, null);
    }

    public RecordButton(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RecordButton(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context, attrs);
    }

    private void initView(Context context, AttributeSet attrs) {
        setWillNotDraw(false);
        mRingWidth = (int) (getResources().getDisplayMetrics().density * 10 + 0.5f);

        mNormalColor = getResources().getColor(android.R.color.holo_red_dark);
        mPressColor = getResources().getColor(android.R.color.holo_red_light);

        mCP = new Paint();
        mCP.setColor(mNormalColor);
        mCP.setAntiAlias(true);

        mCirRect = new RectF();

        setOnTouchListener(this);

    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        float width = getMeasuredWidth();
        float height = getMeasuredHeight();

        mCirRect.set(mRingWidth, mRingWidth, width - mRingWidth, height - mRingWidth);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mCanvas = canvas;

        mCanvas.drawOval(mCirRect, mCP);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mCP.setColor(mPressColor);
                mCanvas.drawOval(mCirRect, mCP);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                mCP.setColor(mNormalColor);
                mCanvas.drawOval(mCirRect, mCP);
                invalidate();
                break;
            default:
                break;
        }
        return true;
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        mCanvas = null;
    }
}
键盘舞者113 2018-04-22
  • 打赏
  • 举报
回复
你再贴点别的代码

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧