[英]Android Using OnTouchListener in Canvas
因此,我正在開發一個用戶可以與圖像進行交互的應用程序,我需要使用OnTouchListener,但是我不知道如何正確地進行操作。 每當我單擊圖像時,什么都不會發生。 最后,我試圖獲得一個圓圈,該圓圈將在用戶觸摸圖像時出現,並且將隨手指移動。 這是我的MainActivity:
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File file = new File(Environment.getExternalStorageDirectory() + "/Pictures/boxes.jpg");
String fileString = file.getPath();
takenPhoto = (ImageView) findViewById(R.id.imageView1);
bmp = BitmapFactory.decodeFile(fileString);
mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);
takenPhoto.setImageBitmap(mutableBitmap);
}
private static class DrawView extends View {
public DrawView(Context context) {
super(context);
}
public boolean onTouch(View view, MotionEvent event) {
int action = event.getAction();
drawPos.x = event.getX();
drawPos.y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
drawing = true;
this.invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
drawing = false;
this.invalidate();
break;
default:
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (drawing) {
canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint);
}
}
}
}
一個更簡單的解決方案是使用一個自定義ImageView來處理圖像和繪圖:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
public class DrawingImageView extends ImageView {
private PointF point;
private Paint paint = new Paint();
public DrawingImageView(Context context) {
super(context);
}
public DrawingImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DrawingImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
point = new PointF(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
point.set(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
point = null;
invalidate();
break;
}
return true;
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
if (point != null) {
canvas.drawCircle(point.x, point.y, 100, paint);
}
}
}
然后在您的xml文件中:
<your.package.DrawingImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在您的活動中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
view = (DrawingImageView) findViewById(R.id.image);
//...
view.setImageBitmap(mutableBitmap);
}
就這樣
您需要從Activity中刪除最后一個onTouch
方法,並刪除setOnTouchListener
。 由於活動捕獲觸摸事件,因此視圖將永遠無法訪問它。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File file = new File(Environment.getExternalStorageDirectory() + "/Pictures/boxes.jpg");
String fileString = file.getPath();
takenPhoto = (ImageView) findViewById(R.id.imageView1);
bmp = BitmapFactory.decodeFile(fileString);
mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);
takenPhoto.setImageBitmap(mutableBitmap);
}
private static class DrawView extends View {
public DrawView(Context context) {
super(context);
}
public boolean onTouch(View view, MotionEvent event) {
int action = event.getAction();
drawPos.x = event.getX();
drawPos.y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
drawing = true;
this.invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
drawing = false;
this.invalidate();
break;
default:
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (drawing) {
canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.