Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用位图顶部的画布在自定义图像视图上绘制_Android_Canvas_Imageview - Fatal编程技术网

Android 使用位图顶部的画布在自定义图像视图上绘制

Android 使用位图顶部的画布在自定义图像视图上绘制,android,canvas,imageview,Android,Canvas,Imageview,我有一个Android应用程序,我需要拍一张照片,显示它,然后可以在上面放一个标记图标。 我成功地拍摄了照片并将其显示在ImageView上,但现在我尝试在其上做标记,因此我搜索并发现一个好的解决方案是将ImageView子类化,这就是我所做的,但当我在自定义ImageView上绘制画布时,它是空白的 我就是这样做的,首先是自定义图像视图: public class CustomImageView extends AppCompatImageView { private Point m

我有一个Android应用程序,我需要拍一张照片,显示它,然后可以在上面放一个标记图标。 我成功地拍摄了照片并将其显示在ImageView上,但现在我尝试在其上做标记,因此我搜索并发现一个好的解决方案是将ImageView子类化,这就是我所做的,但当我在自定义ImageView上绘制画布时,它是空白的

我就是这样做的,首先是自定义图像视图:

public class CustomImageView extends AppCompatImageView {

    private Point mTouch;
    private Bitmap mMarker;

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

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

    private void init() {
        mTouch = new Point();
        mMarker = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_mark);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            mTouch =  new Point(Math.round(event.getX()), Math.round(event.getY()));

        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas c) {
        super.onDraw(c);

        Paint paint = new Paint();
        c.drawBitmap(mMarker, mTouch.x, mTouch.y, paint);
     }

}
我在哪里使用它:

....
mCustomImageView = (CustomImageView) view.findViewById(R.id.mypic);
....
File imgFile = new File(getContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES),"mypic.jpg");
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
Bitmap myMutableBitmap = myBitmap.copy(Bitmap.Config.RGB_565,true);
mCanvas = new Canvas(myMutableBitmap);
mCustomImageView.draw(mCanvas);
然后什么也看不出来。。。看起来mCustomImageView是空的,当然onDraw永远不会被激发,因为我不能在上面绘制

但如果我用这个:

mCustomImageView.setImageBitmap(myMutableBitmap);
然后显示图像,并发送触摸事件。但我认为这样我就不会在画布上画画,而且onDraw也不会被解雇


有任何提示吗?

onDraw
不会在触摸事件后调用。将
invalidate()
添加到
onTouchEvent
以强制刷新可能会解决您的问题。

完美!谢谢