【问题标题】:How do I draw an image from drawable onto an imageview with Canvas - Android如何使用 Canvas - Android 将图像从可绘制对象绘制到图像视图上
【发布时间】:2011-11-28 19:33:11
【问题描述】:

我有一个包含ImageView 的活动。我想要做的是能够使用可绘制文件夹中的图像绘制用户触摸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时,将在他触摸它的位置绘制图像。

【问题讨论】:

    标签: android canvas imageview drawable


    【解决方案1】:

    您将希望继承 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);
            }
        }
    
    }
    

    HTH!

    【讨论】:

    • 感谢您的回复。在您的示例中,您在哪里将 Canvas 设置为 imageView2? (我要绘制的图像视图)
    • 更清楚地说,这个自定义类取代了现有布局中的 imageView2。 ImageView 的图像内容和各个触摸点一起绘制在同一个 Canvas(绘制在图像上的触摸标记)上,在 ImageView 的范围内。
    • 我已经尝试让您的代码与我的活动一起工作,但我得到的只是我原来的 Imageview,当我触摸它时它什么也没做。活动开始时我需要在 onCreate 方法中声明什么。我不应该需要 onTouchListener,因为我在下面有 onTouchEvent,对吧?
    • 正确,确保没有 OnTouchListener 附加到此视图,否则它们可能会窃取触摸,并确保您在布局中确实有一个新自定义类的实例,而不是普通的香草图像视图。
    • 我删除了onTouchListener,所以我只有子类中的onTouchEvent,我在xml中创建了一个自定义Imageview并在布局中声明它,但它仍然没有做任何事情。就像 onTouchEvent 没有发生一样。我错过了什么吗?我必须在 onCreate 方法中声明什么特定的东西才能正常工作吗?
    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2014-02-03
    • 2011-11-27
    • 2011-08-28
    • 2012-06-06
    • 2020-07-09
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多