Android画布不在另一种方法中绘制位图

时间:2017-10-08 05:11:31

标签: android canvas bitmap

我使用canvas在位图上绘制并设置imageView上覆盖的位图。

我在drawGraph()方法中绘制了一个基本绘图,当用户在画布中触摸时我必须在那里画一个圆圈,因为我在onTouchEvent()方法中使用了canvas,它没有在那里绘制任何东西,下面给出了代码,问题是什么以及如何解决这个问题。

我还尝试在其上创建另一个带有直线的位图,在drawGraph()和checkClicked()的末尾将新位图设置为imageView。它显示新的位图(绘制直线)在开始时正确设置为imageView,但是当单击imageView时,空白位图(未绘制直线)设置为imageView。所以我确信画布画在checkClicked()中不起作用。

感谢您提前帮助我!

ImageView imageView;

Paint p = new Paint();
Bitmap myBitmap;
Bitmap workingBitmap;
Bitmap mutableBitmap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img_drawpanel);
    workingBitmap = Bitmap.createBitmap(myBitmap);
    mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true);

    imageView = (ImageView) findViewById(R.id.image1);

    imageView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            int touchX = (int) (event.getX() + imageView.getX());
            int touchY = (int) (event.getY() + imageView.getY());

            checkClicked(touchX, touchY);

            return true;
        }
    });

    drawGraph();
}

public void drawGraph(){

    p.setAntiAlias(true);
    p.setColor(Color.BLACK);
    p.setStyle(Style.FILL_AND_STROKE);
    p.setStrokeWidth(5);

    Canvas canvas = new Canvas(mutableBitmap);

    //basic drawing is successfully drawn here

    imageView.setAdjustViewBounds(true);
    imageView.setImageBitmap(mutableBitmap);

}

public void checkClicked(int x, int y){

    p.setAntiAlias(true);
    p.setColor(Color.RED);
    p.setStyle(Style.FILL_AND_STROKE);

    Canvas canvas = new Canvas(mutableBitmap);

    //canvas doesn't draw a circle here
    canvas.drawCircle(x, y, 10, p);

    imageView.setAdjustViewBounds(true);
    imageView.setImageBitmap(mutableBitmap);

1 个答案:

答案 0 :(得分:0)

正在绘制,但绘制的位置错误。因为视图中的坐标与位图中的坐标不同。

您可以通过从imageView开始触摸并将手指拖向屏幕的左上角来验证它。

您需要获取屏幕和图像视图的比例和平移,并在绘制前转换坐标。

您可以使用imageView.getImageMatrix()获取包含图像转换的imageView的绘图矩阵,并相应地进行数学运算。