问题描述
我正在尝试制作一个需要在屏幕中拖动 ImageView 时画一条线的应用程序。我试图在 LinearLayouts 下创建一个画布,但是当我拖动对象时它没有绘制。请帮我!这是来自 MainActivity、CanvasView 类和 xml 文件的代码。我不知道我应该如何从 CanvasView 类调用 onTouchEvent 方法。当我触摸该图标时,它会创建一个阴影,但不会绘制超出我预期的线条。
package com.example.drawview;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.content.ClipData;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private CanvasView canvasView;
private ConstraintLayout mainLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.imageView).setonTouchListener(new TouchEventView(this));
mainLayout = findViewById(R.id.screen);
canvasView = (CanvasView) findViewById(R.id.canvas);
}
public class TouchEventView extends View implements View.OnTouchListener {
public TouchEventView(Context context) {
super(context);
}
@Override
public boolean onTouch(View ve,MotionEvent event) {
canvasView.onTouchEvent(event);
ClipData data = ClipData.newPlainText("simple_text","text");
View.DragShadowBuilder sb = new View.DragShadowBuilder(ve);
ve.startDrag(data,sb,ve,0);
return true;
}
}
}
package com.example.drawview;
import android.content.ClipData;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.Nullable;
public class CanvasView extends View {
public int height;
public int width;
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mPaint;
private float mX,mY;
private final float TOLERANCE = 5;
Context context;
public CanvasView(Context context,@Nullable AttributeSet attrs) {
super(context,attrs);
this.context = context;
mPath = new Path();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.GREEN);
mPaint.setStyle(Paint.Style.stroke);
mPaint.setstrokeJoin(Paint.Join.ROUND);
mPaint.setstrokeWidth(4f);
}
/*
public CanvasView(Context context) {
super(context);
this.context = context;
mPath = new Path();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.GREEN);
mPaint.setStyle(Paint.Style.stroke);
mPaint.setstrokeJoin(Paint.Join.ROUND);
mPaint.setstrokeWidth(4f);
}
*/
@Override
protected void onSizeChanged(int w,int h,int oldw,int oldh) {
super.onSizeChanged(w,h,oldw,oldh);
mBitmap = Bitmap.createBitmap(w,Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(mPath,mPaint);
}
private void startTouch(float x,float y){
mPath.moveto(x,y);
mX = x;
mY = y;
}
private void movetouch(float x,float y){
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if(dx >= TOLERANCE || dy >= TOLERANCE){
mPath.quadTo(mX,mY,(x + mX)/2,(y + mY)/2);
mX = x;
mY = y;
}
}
public void clearCanvas(){
mPath.reset();
invalidate();
}
private void upTouch(){
mPath.lineto(mX,mY);
}
public boolean onTouchEvent(MotionEvent event) {
float xPos = event.getX();
float yPos = event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startTouch(xPos,yPos);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
movetouch(xPos,yPos);
invalidate();
break;
case MotionEvent.ACTION_UP:
upTouch();
invalidate();
break;
}
return true;
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.example.drawview.CanvasView
android:id="@+id/canvas"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/todo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_launcher_foreground" />
</androidx.constraintlayout.widget.ConstraintLayout>
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)