如何在用户触摸图像的位置在图像上绘制圆圈。
使用imageview设置图像。
我在网上找到了一个解决方案,它在新画布上创建了图像位图并在其上绘制了一个圆圈(在http://joerg-richter.fuyosoft.com/?p=120处找到了解决方案) 像
这样的东西ImageView imageView = (ImageView) findViewById (R.id.image1);
myBitmap = BitmapFactory.decodeResource(getResources(), drawid);
Paint myCircPaint = new Paint();
tempBitmap = Bitmap.createBitmap(bitmapXht, bitmapYht, Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(tempBitmap);
tempCanvas.drawBitmap(myBitmap, 0, 0, null);
myCircPaint.setStrokeWidth(5);
tempCanvas.drawCircle(evX, evY, 15, myCircPaint);
imageView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap));
这是有效的,但由于我每次触摸都会绘制圆圈,因此每次都会绘制所有内容。如何避免每次都绘制主图像。是否可以在多个触摸事件中保留画布。
我还是Android的新手,所以请原谅这是非常简单的事情
答案 0 :(得分:0)
您需要自定义视图。
创建TouchableImageView
Java类:
public class TouchableImageView extends android.support.v7.widget.AppCompatImageView {
public static final String BUNDLE_SUPER_STATE = "bundle_super_state";
public static final String BUNDLE_POINT_LIST = "bundle_point_list";
private float mRadius;
private Paint myCirclePaint = null;
private List<PointF> mPoints;
private GestureDetector mDetector;
public TouchableImageView(Context context) {
super(context);
init(context);
}
public TouchableImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public TouchableImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mRadius = 15;
myCirclePaint = new Paint();
mPoints = new ArrayList<>();
mDetector = new GestureDetector(context, new MyListener());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mPoints != null) {
for (int i = 0; i < mPoints.size(); i++) {
canvas.drawCircle(mPoints.get(i).x, mPoints.get(i).y, mRadius, myCirclePaint);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return mDetector.onTouchEvent(event);
}
@Nullable
@Override
protected Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable(BUNDLE_SUPER_STATE, super.onSaveInstanceState());
bundle.putParcelableArrayList(BUNDLE_POINT_LIST, (ArrayList<? extends Parcelable>) mPoints);
return bundle;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state instanceof Bundle) {
Bundle bundle = (Bundle) state;
mPoints = bundle.getParcelableArrayList(BUNDLE_POINT_LIST);
super.onRestoreInstanceState(bundle.getParcelable(BUNDLE_SUPER_STATE));
} else {
super.onRestoreInstanceState(state);
}
}
class MyListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent event) {
if (mPoints != null) {
mPoints.add(new PointF(event.getX(), event.getY()));
invalidate();
}
return true;
}
}
}
并将ImageView
替换为TouchableImageView
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.touchable.TouchableImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher" />
</android.support.constraint.ConstraintLayout>