Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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
如何使用Canvas-Android将图像从drawable绘制到imageview_Android_Canvas_Imageview_Drawable - Fatal编程技术网

如何使用Canvas-Android将图像从drawable绘制到imageview

如何使用Canvas-Android将图像从drawable绘制到imageview,android,canvas,imageview,drawable,Android,Canvas,Imageview,Drawable,我有一个活动,其中有一个ImageView。我想做的是能够使用drawable文件夹中的图像在用户触摸该Imageview的位置进行绘制。我已经读到最好的方法是使用Canvas,但我不确定在哪里以及如何将onDraw方法与onTouchListener集成。这就是我到目前为止所做的: public class Main extends Activity { @Override public void onCreate(Bundle savedInstanceState) {

我有一个活动,其中有一个
ImageView
。我想做的是能够使用drawable文件夹中的图像在用户触摸该
Imageview
的位置进行绘制。我已经读到最好的方法是使用Canvas,但我不确定在哪里以及如何将
onDraw
方法与
onTouchListener
集成。这就是我到目前为止所做的:

public class Main extends Activity
{
   @Override
   public void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      final TextView textView = (TextView)findViewById(R.id.textView);
      final ImageView image = (ImageView) findViewById(R.id.imageView2);

      //Bitmap
      Bitmap viewBitmap = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
      Canvas canvas = new Canvas(viewBitmap);
      image.draw(canvas);

      image.setOnTouchListener(new View.OnTouchListener()
      {
         @Override
         public boolean onTouch(View v, MotionEvent event)
         {
            textView.setText("Touch coordinates : " + String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
            return false;
         }
      });
   }
}

因此,我想做的是,当用户触摸
ImageView
时,将在他触摸它的地方准确地绘制一幅图像。

您需要对
ImageView
进行子类化,以覆盖其
onDraw()
方法。通过这样做,您还可以在
onTouchEvent()
中添加自定义触摸处理,而不是附加侦听器。这不是一个完整的示例,但类似于以下内容:

public class CustomImageView extends ImageView {

    private ArrayList<Point) mTouches;
    private Bitmap mMarker;

    //Java constructor
    public CustomImageView(Context context) {
        super(context);
        init();
    }

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

    private void init() {
        mTouches = new ArrayList<Point>();
        mMarker = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_marker_image);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //Capture a reference to each touch for drawing
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            mTouches.add( new Point(event.getX(), event.getY()) );
            return true;
        }

        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas c) {
        //Let the image be drawn first
        super.onDraw(c);

        //Draw your custom points here
        Paint paint = new Paint();            
        for(Point p : mTouches) {
            c.drawBitmap(mMarker, p.x, p.y, paint);
        }
    }

}
公共类CustomImageView扩展了ImageView{

private ArrayList感谢您的回答。在您的示例中,您在哪里将画布设置为imageView2?(我要绘制的imageview)为了更清楚,此自定义类将取代现有布局中的imageView2。imageview的图像内容和各个接触点一起绘制在同一画布上(在图像上绘制的触摸标记),在ImageView的范围内。我已经尝试让您的代码与我的活动一起工作,但我得到的只是我的原始ImageView,当我触摸它时它不会做任何事情。活动开始时,我是否需要在onCreate方法中声明什么。我不应该需要onTouchListener,因为我有下面的onTouchEvent,对吗?Correct,确保没有onTouchListener附加到此视图,否则它们可能会窃取内容,并确保布局中确实有新自定义类的实例,而不是普通的ImageView。我删除了onTouchListener,因此我只有子类中的onTouchEvent,我在xml中创建了自定义ImageView并在布局中声明了它,但它仍然没有做任何事情。就像onTouchEvent没有出现一样。我是否遗漏了什么?是否有一些特定的东西我必须在onCreate方法中声明,这样才能工作?