基于此问题的答案:Android drawing a line to follow your finger
我尝试了我的解决方案(参见代码),但我得到了像意大利面条的形状..如何摆脱前面的行?我想像在 Microsoft Paint 中一样画一条直线。
这是我的代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downx = event.getX();
downy = event.getY();
invalidate();
break;
case MotionEvent.ACTION_MOVE:
upx = event.getX();
upy = event.getY();
mCanvas.drawLine(downx, downy, upx, upy, mPaint);
invalidate();
break;
case MotionEvent.ACTION_UP:
upx = event.getX();
upy = event.getY();
mCanvas.drawLine(downx, downy, upx, upy, mPaint);
invalidate();
break;
}
return true;
}
谢谢大家!
PS:这不是重复的问题,我在上面解释过!
最佳答案
你不应该在onTouchEvent
中画画,不要存储对 canvas
的引用,移动drawLine
至
@Override protected void onDraw(Canvas canvas) { ... }
invalidate()
会打电话draw()
为您调用 onDraw()
.
一般情况下:使用 UI 事件,如 onTouchEvent
和onClick
修改 View 的状态,然后调用invalidate()
从这些事件中并实现 onDraw
所以它总是渲染对象的状态。
FingerLine.java
import android.content.Context;
import android.graphics.*;
import android.graphics.Paint.Style;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.*;
public class FingerLine extends View {
private final Paint mPaint;
private float startX;
private float startY;
private float endX;
private float endY;
public FingerLine(Context context) {
this(context, null);
}
public FingerLine(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Style.STROKE);
mPaint.setColor(Color.RED);
}
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(startX, startY, endX, endY, mPaint);
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
// Set the end to prevent initial jump (like on the demo recording)
endX = event.getX();
endY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_MOVE:
endX = event.getX();
endY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP:
endX = event.getX();
endY = event.getY();
invalidate();
break;
}
return true;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<net.twisterrob.android.view.FingerLine
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
MainActivity.java
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
结果
注意:我正在使用<application android:theme="@style/Theme.AppCompat.Light">
,但我认为这不会产生影响。
关于java - Android 画一条线来跟随你的手指,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27321178/