如何使用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方法中声明,这样才能工作?