gpt4 book ai didi

java - Android 画一条线来跟随你的手指

转载 作者:行者123 更新时间:2023-12-01 06:43:28 26 4
gpt4 key购买 nike

基于此问题的答案: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 事件,如 onTouchEventonClick修改 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);
}
}

结果

example

注意:我正在使用<application android:theme="@style/Theme.AppCompat.Light"> ,但我认为这不会产生影响。

关于java - Android 画一条线来跟随你的手指,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27321178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com