android捕获手势并在 Canvas 上绘制,绘制不完整

标签 android android-canvas

我正在创建一个应用程序,用户可以在其中在 Canvas 上绘制一个字母,如果绘制的是一个实际的字母,它就会得到验证。我正在使用内部带有 Canvas 的 GestureOverlayView 来捕获手势和路径,问题是 Canvas 没有绘制我用手绘制的整个路径/手势。我需要帮助才能找到解决方案。我需要完整绘制路径/手势。

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

    <android.gesture.GestureOverlayView
         android:id="@+id/gestures"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:eventsInterceptionEnabled="true"
         android:gestureStrokeType="multiple"
         android:layout_alignParentRight="true"
         android:fadeOffset="500"
         android:background="#000000">
              <cohen.projetoTEA.com.DrawLetter
                 android:id="@+id/drawing"
                 android:layout_width="wrap_content"
                 android:layout_alignParentRight="true"
                 android:layout_height="wrap_content"
                 android:background="#FFFFFF" 
                 />
         </android.gesture.GestureOverlayView>
</RelativeLayout>

Activity

public class Reconhecimento extends Activity implements OnGesturePerformedListener {
GestureLibrary mLibrary;
private final File mStoreFile = new      File(Environment.getExternalStorageDirectory(), "gestures");
    /**
     * Called when the activity is first created.
     */
    @Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.reconhecimento);
   //mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
   mLibrary = GestureLibraries.fromFile(mStoreFile);
   if (!mLibrary.load()) {
     finish();
   }

   GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
   gestures.addOnGesturePerformedListener(this);
   gestures.setGestureVisible(false);
}

    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
   ArrayList<Prediction> predictions = mLibrary.recognize(gesture);

   if (predictions.size() > 0 && predictions.get(0).score > 1.0) {
     String result = predictions.get(0).name;
      Toast.makeText(this, result, Toast.LENGTH_LONG).show();
     if ("open".equalsIgnoreCase(result)) {
       Toast.makeText(this, "Opening the document", Toast.LENGTH_LONG).show();
     } else if ("save".equalsIgnoreCase(result)) {
       Toast.makeText(this, "Saving the document", Toast.LENGTH_LONG).show();
     }
   }
}

}

DrawLetter 应用

public class DrawLetter extends View {
    //drawing path
    private Path drawPath;
    //drawing and canvas paint
    private Paint drawPaint, canvasPaint;
    //initial color
    private int paintColor = 0xFF660000;
    //canvas
    private Canvas drawCanvas;
    //canvas bitmap
    private Bitmap canvasBitmap;
    private boolean erase=false;
   public DrawLetter(Context context, AttributeSet attrs){
        super(context, attrs);
        setupDrawing();
    }

    private void setupDrawing(){
        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(5);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
    }
    public void setErase(boolean isErase){
        erase=isErase;
        if(erase){ 
            drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
            drawPaint.setStrokeWidth(10);
        }
        else{
            drawPaint.setXfermode(null);
            drawPaint.setStrokeWidth(5);
        }
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    //view given size
        super.onSizeChanged(w, h, oldw, oldh);
        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
    }



    @Override
    protected void onDraw(Canvas canvas) {
    //draw view
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
    //detect user touch
        float touchX = event.getX();
        float touchY = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_UP:
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath.reset();
                break;
            default:
                return false;
        }
    invalidate();
    return true;
    }

    public boolean getErase(){ return erase; }
}

最佳答案

你可以用另一种方式来做。 像这样

 <android.gesture.GestureOverlayView
  android:id="@+id/g1"
  android:layout_width="fill_parent"
  android:layout_height="200dp"
  android:background="#ffffff"
  android:fadeOffset="999999"
  android:gestureColor="#0000FF"
  android:gestureStrokeType="multiple"
  android:gestureStrokeWidth="5" > 

<android.gesture.GestureOverlayView
  android:id="@+id/g2"
  android:layout_width="fill_parent"
  android:layout_height="200dp"
  android:gestureStrokeType="multiple" 
  android:fadeOffset="001"
  android:gestureColor="#000"
  android:gestureStrokeAngleThreshold="0.0"
  android:gestureStrokeLengthThreshold="0.0"
  android:gestureStrokeSquarenessThreshold="0.0"

   >  
  </android.gesture.GestureOverlayView>
  </android.gesture.GestureOverlayView>

这里 GestureOverlayView g2 在 g1 内。

g2 用于识别字母,一旦输入字母,它就会消失。

但 g1 不会消失。

如果您不想要该字母,您可以清除 GestureOverlayView。

关于android捕获手势并在 Canvas 上绘制,绘制不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30813422/

相关文章:

android - 防止某些设备上的 Android 方向改变

java - 在 TextView 中的两个可绘制对象之间绘制线条

java - 多个 viewholder recyclerview 不加载屏幕外 View

android - 使用 + 符号的国家代码验证,Android

java - 用于 java 或 android 的 ePub 库

java - 如何在 Canvas 上绘制全部大写的文本

java - 合并两个重叠的图像

android - SurfaceHolder.setFormat(PixelFormat.RGBA_8888) 在某些设备上失败,而在其他设备上失败

java - 我的 canvas.drawtext() 不起作用

Android密度绘画StrokeWidth计算