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

标签 java android

基于此问题的答案: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/

相关文章:

java.lang.System.arraycopy( native 方法)中的 java.lang.ArrayStoreException

java - 当 SecurityManager.checkExit 抛出异常时,System.exit(0) 不会阻止最终被调用

java - 带有计数字段的 JPQL ManyToMany 查询

java - 为什么我在 Java/Android 中得到空 SQLite 字段的 "0.0"?

android - Android 上的低熵

android - 用相机拍照然后裁剪

java - 如何在android中的 TextView 中打印1到10个数字?

java - 是否可以通过.forEach方法列出文件特征?

来自数据库的 Android 微调器数据

android - 为 Google Analytics 设置屏幕名称