让所有点在机器人路径 - FingerPaint.java [英] Getting all points in Path in android - FingerPaint.java

查看:105
本文介绍了让所有点在机器人路径 - FingerPaint.java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图让所有的X,被画在画布上的路径y坐标。但我不能获得积分。我得到只有几个点。这是为什么呢?

有什么办法,我可以得到所有的X和Y点?

我用FingerPaint.java为出发点。

<一个href="http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.html"相对=nofollow>链接到原始FingerPaint.java

下面是code I修改和使用:

 包com.schogini.whiteboard;

进口的java.util.ArrayList;
进口java.util.StringTokenizer的;

进口android.app.Activity;
进口android.content.Context;
进口android.graphics *。
进口android.os.Bundle;
进口android.util.DisplayMetrics;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuInflater;
进口android.view.MenuItem;
进口android.view.MotionEvent;
进口android.view.View;
//进口android.widget.Toast;

公共类FingerPaint扩展活动实现ColorPickerDialog.OnColorChangedListener {
    //颜色 -  ARGB
    INT A = 255;
    INT R = 255;
    INT G = 0;
    INT B = 0;

    //擦除标记
    布尔eraseFlag = FALSE;
    //上网发帖
    静态字符串toSend;
    静态字符串parseStr;

    //阵列,用于存储X,Y,R,G,B,A
    静态的ArrayList&LT;字符串&GT; RARRAY,gArray,bArray,alphaArray,xPointArray,yPointArray;
    // ArrayList的&LT;字符串&GT; rArray_in,gArray_in,bArray_in,alphaArray_in,xPointArray_in,yPointArray_in;

    //绘图类型
    私人静电漆mPaint;
    私人MaskFilter将mEmboss;
    私人MaskFilter将运动模糊;

    //触摸 - 路径坐标
    私有静态浮动MX;
    私有静态浮动我的;

    // MyView的对象
    MyView的米;

    //点​​填入
    浮DX,DY,距离;
    INT DD,二;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        M =新的MyView的(FingerPaint.this);
        的setContentView(米);

        //移动到相应的模块
        RARRAY =新的ArrayList&LT;字符串&GT;();
        gArray =新的ArrayList&LT;字符串&GT;();
        bArray =新的ArrayList&LT;字符串&GT;();
        alphaArray =新的ArrayList&LT;字符串&GT;();
        xPointArray =新的ArrayList&LT;字符串&GT;();
        yPointArray =新的ArrayList&LT;字符串&GT;();

        mPaint =新的油漆();
        mPaint.setAntiAlias​​(真正的);
        mPaint.setDither(真正的);
        mPaint.setColor(0xFFFF0000地址);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap​​(Paint.Cap.ROUND);

        //宽绘图刷
        mPaint.setStrokeWidth(12);

        mEmboss =新EmbossMaskFilter(新的浮动[] {1,1,1},0.4f,6,3.5F);
        运动模糊=新BlurMaskFilter(8,BlurMaskFilter.Blur.NORMAL);
    }

    公共无效解析(字符串str22){
         //从服务器接收到的例子字符串
// parseStr = "255,0,0,1.0,88.0,100.0||255,0,0,1.0,88.0,101.0||255,0,0,1.0,88.0,102.0||255,0,0,1.0,88.0,103.0||255,0,0,1.0,88.0,104.0||255,0,0,1.0,88.0,105.0||255,0,0,1.0,88.0,106.0||255,0,0,1.0,88.0,107.0||255,0,0,1.0,88.0,108.0," +
// "||255,0,0,1.0,88.0,109.0||255,0,0,1.0,88.0,110.0||255,0,0,1.0,88.0,111.0||255,0,0,1.0,88.0,112.0||255,0,0,1.0,88.0,113.0||255,0,0,1.0,88.0,114.0||255,0,0,1.0,88.0,115.0||255,0,0,1.0,88.0,116.0||255,0,0,1.0,88.0,117.0," +
// "||255,0,0,1.0,88.0,118.0||255,0,0,1.0,88.0,119.0||255,0,0,1.0,88.0,120.0||255,0,0,1.0,80.0,100.0||255,0,0,1.0,81.0,100.0||255,0,0,1.0,82.0,100.0||255,0,0,1.0,83.0,100.0||255,0,0,1.0,84.0,100.0||255,0,0,1.0,85.0,100.0," +
// "||255,0,0,1.0,86.0,100.0||255,0,0,1.0,87.0,100.0||255,0,0,1.0,88.0,100.0||255,0,0,1.0,89.0,100.0||255,0,0,1.0,91.0,100.0||255,0,0,1.0,92.0,100.0||255,0,0,1.0,93.0,100.0||255,0,0,1.0,94.0,100.0||255,0,0,1.0,95.0,100.0," +
// "||255,0,0,1.0,96.0,100.0||255,0,0,1.0,97.0,100.0||255,0,0,1.0,98.0,100.0||255,0,0,1.0,99.0,100.0||255,0,0,1.0,100.0,100.0||255,0,0,1.0,101.0,100.0||255,0,0,1.0,102.0,100.0||255,0,0,1.0,103.0,100.0,";
        parseStr="255,0,0,255,85.351585,90.17996||255,0,0,255,85.351585,90.17996||255,0,0,255,123.97784,80.883064||255,0,0,255,164.47311,71.58616||255,0,0,255,182.22874,65.543175||255,0,0,255,233.9381,48.3439||255,0,0,255,247.95567,42.30091||255,0,0,255,252.62822,40.441532||255,0,0,255,252.62822,40.441532||255,0,0,255,86.9091,167.34427||255,0,0,255,86.9091,167.34427||255,0,0,255,86.9091,167.34427||255,0,0,255,151.70154,133.41057||255,0,0,255,190.3278,118.07068||255,0,0,255,235.18411,98.54717||255,0,0,255,248.57867,92.03935||255,0,0,255,256.36627,89.71512||255,0,0,255,257.30078,89.250275||255,0,0,255,257.30078,89.250275||255,0,0,255,82.548065,277.97742||255,0,0,255,82.548065,277.97742||255,0,0,255,82.548065,277.97742||255,0,0,255,116.50179,258.91876||255,0,0,255,152.63605,240.7898||255,0,0,255,209.95244,215.68816||255,0,0,255,239.23363,199.41858||255,0,0,255,249.8247,192.4459||255,0,0,255,261.35028,186.86777||255,0,0,255,261.9733,186.86777||255,0,0,255,261.9733,186.86777||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,48.905834,62.7541||255,0,0,255,39.56077,133.87541||255,0,0,255,44.856304,185.93808||255,0,0,255,53.578365,266.82114||255,0,0,255,53.578365,287.27435||255,0,0,255,51.70935,301.6845||255,0,0,255,51.39785,303.07904||255,0,0,255,51.086346,303.5439||255,0,0,255,51.086346,303.5439||255,0,0,255,90.02411,362.57922||255,0,0,255,88.155106,355.14172||255,0,0,255,109.02575,317.0244||255,0,0,255,133.01141,323.53226||255,0,0,255,155.43958,340.26666||255,0,0,255,166.65363,344.91513||255,0,0,255,185.03226,338.4073||255,0,0,255,193.13133,326.78616||255,0,0,255,210.26395,292.38763||255,0,0,255,228.01956,296.10638||255,0,0,255,259.7928,283.09073||255,0,0,255,266.33432,263.5672||255,0,0,255,267.58032,258.91876||255,0,0,255,269.76086,256.1297||255,0,0,255,271.94138,255.20001||255,0,0,255,284.71295,248.22733||255,0,0,255,294.3695,232.42259||255,0,0,255,297.48453,212.8991||255,0,0,255,297.48453,212.8991||255,0,0,255,101.86119,202.67252||255,0,0,255,101.86119,202.67252||255,0,0,255,101.86119,202.67252||255,0,0,255,113.07527,194.77013||255,0,0,255,141.73346,178.9654||255,0,0,255,144.8485,179.43024||255,0,0,255,166.96513,192.4459||255,0,0,255,170.70317,195.23497||255,0,0,255,193.75432,195.69983||255,0,0,255,201.85338,185.93808||255,0,0,255,212.75597,146.42624||255,0,0,255,217.4285,136.19965||255,0,0,255,231.44609,135.26996||255,0,0,255,241.41415,136.66449||255,0,0,255,250.13622,136.19965||255,0,0,255,279.41742,128.76212||255,0,0,255,312.12512,100.406555||255,0,0,255,312.12512,100.406555||255,0,0,255,92.20462,52.527508||255,0,0,255,92.20462,52.527508||255,0,0,255,159.48909,44.160294||255,0,0,255,186.90128,34.398544||255,0,0,255,242.97165,20.918034||255,0,0,255,269.13785,13.48051||255,0,0,255,288.76245,11.62113||255,0,0,255,288.76245,11.62113,";

        StringTokenizer的令牌=新的StringTokenizer(parseStr,||);
        而(tokens.hasMoreTokens())
        {
            串秒= tokens.nextToken();
            StringTokenizer的tempTokens =新的StringTokenizer(第二,,);
            INT索引= 0;
            而(tempTokens.hasMoreTokens())
            {
                串splitStr = tempTokens.nextToken();
                开关(指数%6){
                情况下0:
                    rArray.add(splitStr);
                    打破;
                情况1:
                    gArray.add(splitStr);
                    打破;
                案例2:
                    bArray.add(splitStr);
                    打破;
                案例3:
                    alphaArray.add(splitStr);
                    打破;
                壳体4:
                    xPointArray.add(splitStr);
                    打破;
                壳体5:
                    yPointArray.add(splitStr);
                    打破;
                默认:
                    打破;
                }
                指数++;
                Log.v(String44,值=+ splitStr);
            }
        }
        m.redraw();
    }

    公共无效colorChanged(INT颜色){
        mPaint.setColor(颜色);

        //方法整数颜色转换为R G B一
        B =(颜色)及为0xFF;
        G =(彩色&GT;&GT; 8)及0xFF的;
        R =(彩色&GT;&GT; 16)及0xFF的;
        A = Math.round(((彩色&GT;&GT;&GT; 24)/ 255)* 10);
    }

    公共类MyView的扩展视图{

        私人位图mBitmap;
        私人帆布mCanvas;
        公共道路的mpath;
        市民漆mBitmapPaint;

        公共MyView的(语境C){
            超级(C);

            //读取屏幕尺寸(设备独立)
            DisplayMetrics displaymetrics =新DisplayMetrics();
            。getWindowManager()getDefaultDisplay()getMetrics(displaymetrics)。

            mBitmap = Bitmap.createBitmap(displaymetrics.widthPixels,displaymetrics.heightPixels,Bitmap.Config.ARGB_8888);
            mCanvas =新的Canvas(mBitmap);
            的mpath =新路径();
            mBitmapPaint =新的油漆(Paint.DITHER_FLAG);
        }

        @覆盖
        保护无效onSizeChanged(INT W,INT小时,INT oldw,诠释oldh){
            super.onSizeChanged(W,H,oldw,oldh);
        }

        @覆盖
        保护无效的OnDraw(帆布油画){
            //背景 - 白色
            canvas.drawColor(0xFFFFFFFF的);

            //绘制位图从0,0的firstpoint在设备的屏幕
            canvas.drawBitmap(mBitmap,0,0,mBitmapPaint);
            canvas.drawPath(的mpath,mPaint);
        }

        公共无效touch_start(浮X,浮动Y){
            //重新设置触摸,这样一个新的路径将被绘制
            mPath.reset();
            mPath.moveTo(X,Y);
            MX = X;
            我= Y;
        }

        公共无效TOUCH_MOVE(浮X,浮动Y){
            mPath.quadTo(MX,MY,(X + MX)/ 2,(Y +我)/ 2);


            //点​​跟踪
            跟踪点((INT)X,(INT)Y,(INT)MX,(INT)我的);
            MX = X;
            我= Y;
        }

        公共无效touch_up(){
            mPath.lineTo(MX,MY);
            //提交路径,我们的屏幕外
            mCanvas.drawPath(的mpath,mPaint);
            //杀了这个,所以我们不重复抽奖
            mPath.reset();
        }

        公共无效arrayPopulate(浮动ATX,浮动ATY){

            如果(eraseFlag == FALSE){
                //进入点到的ArrayList
                xPointArray.add(+ ATX);
                yPointArray.add(+ ATY);

                //添加颜色,以及
                alphaArray.add(+α);
                rArray.add(+ R);
                gArray.add(+ G);
                bArray.add(+ b)的;

//如果(toSend == NULL){
// toSend =+ R +,+ G +,+ B +,+ A +,+ ATX +,+ ATY +||;
//}
//              其他{
// toSend + =+ R +,+ G +,+ B +,+ A +,+ ATX +,+ ATY +||;
//}

                //数据添加到队列发送到服务器

               // Log.v(接触,toSend);
                //这里将数据发送到服务器
                // eraseFlag是真的结束
            }
        }

        @覆盖
        公共布尔的onTouchEvent(MotionEvent事件){
            浮X = event.getX();
            浮动Y = event.getY();
            开关(event.getAction()){
                案例MotionEvent.ACTION_DOWN:
                    touch_start(X,Y​​);
                    arrayPopulate(X,Y);
                    无效();
                    打破;
                案例MotionEvent.ACTION_MOVE:
                    TOUCH_MOVE(X,Y);
                    无效();
                    打破;
                案例MotionEvent.ACTION_UP:
                    润色();
                    arrayPopulate(X,Y);
                    无效();
                    打破;
            }
            返回true;
        }

        公共无效重绘(){
            INT ARRAYSIZE = FingerPaint.rArray.size();

            INT索引= 0;
            浮XX,YY;

            //设置tPaint的性质
            油漆tPaint =新的油漆();
            tPaint.setAntiAlias​​(真正的);
            tPaint.setDither(真正的);
            tPaint.setStyle(Paint.Style.STROKE);
            tPaint.setStrokeJoin(Paint.Join.ROUND);
            tPaint.setStrokeCap​​(Paint.Cap.ROUND);
            tPaint.setColor(-16777216);
            tPaint.setStrokeWidth(12);

            而(指数&LT; ARRAYSIZE){
                    //tPaint.setARGB(Integer.parseInt(alphaArray.get(0)),的Integer.parseInt(rArray.get(0)),的Integer.parseInt(gArray.get(0)),的Integer.parseInt(bArray.get( 0)));
                    //tPaint.setColor(Color.argb(Integer.parseInt(alphaArray.get(0)),的Integer.parseInt(rArray.get(0)),的Integer.parseInt(gArray.get(0)),的Integer.parseInt( bArray.get(0))));

                    XX = Float.parseFloat(xPointArray.get(指数));
                    YY = Float.parseFloat(yPointArray.get(指数));

                    m.mCanvas.drawPoint(XX,YY,tPaint);
                    m.invalidate();
                    指数++;
                    Log.d(__ REDRAW__,X =+ XX +Y =+ YY);
              }
        }
    }

    //创建选项菜单 - 充气
    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
    MenuInflater充气= getMenuInflater();
    inflater.inflate(R.menu.menu,菜单);
    返回true;
    }

    //选项菜单选择 - 操作
    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        mPaint.setXfermode(空);
        mPaint.setAlpha(255);

        开关(item.getItemId()){
            案例R.id.C​​OLOR:
                this.eraseFlag = FALSE;
                新ColorPickerDialog(这个,这​​个,mPaint.getColor())显示()。
                返回true;
            案例R.id.EMBOSS:
                this.eraseFlag = FALSE;
                如果(mPaint.getMaskFilter()!= mEmboss){
                    mPaint.setMaskFilter(mEmboss);
                } 其他 {
                    mPaint.setMaskFilter(空);
                }
                返回true;
            案例R.id.BLUR:
                this.eraseFlag = FALSE;
                如果(mPaint.getMaskFilter()!=运动模糊){
                    mPaint.setMaskFilter(运动模糊);
                } 其他 {
                    mPaint.setMaskFilter(空);
                }
                返回true;
            案例R.id.ERASE:
                //用于切换检测
                this.eraseFlag = TRUE;
                //重新设置罗嗦和放大器;浮雕
                mPaint.setMaskFilter(空);
                mPaint.setXfermode(新PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                返回true;
            案例R.id.REDRAW:
                this.eraseFlag = FALSE;
                //重画绘制点
                m.redraw();
                返回true;
        }
       返回super.onOptionsItemSelected(项目);
    }

    // Bressenham的中点算法查找任意两点---直线之间的所有点
    公共无效跟踪点(INT XXX,YYY INT,INT×2,INT Y2){
        INT W = X 2  -  XXX;
        INT H = Y2  -  YYY;
        INT DX1 = 0,DY1 = 0,DX2 = 0,DY2 = 0;
        如果(瓦特℃,)的dx1 = -1;否则如果(并且R w 0)的dx1 = 1;
        如果(H&小于0)DY1 = -1;否则如果(h取代; 0)DY1 = 1;
        如果(瓦特℃,)DX2 = -1;否则如果(并且R w 0)DX2 = 1;
        INT最长= Math.abs(瓦特);
        INT最短= Math.abs(H);
        如果((最长&GT;!最短)){
            最长= Math.abs(H);
            最短= Math.abs(瓦特);
            如果(H&小于0)DY2 = -1;否则如果(h取代; 0)DY2 = 1;
            DX2 = 0;
        }
        INT分子=最长&GT;&GT; 1;
        的for(int i = 0; I&LT; =最长的;我++){
            m.arrayPopulate((浮点)XXX(浮动)YYY);
            分子+ =最短;
            如果((分子&所述;!最长)){
                分子 -  =最长的;
                XXX + = DX1;
                YYY + = DY1;
            } 其他 {
                XXX + = DX2;
                YYY + = DY2;
            }
        }
    }
}
 

解决方案

您需要进行插值找到更新的点。我建议余弦插值。它易于实施,产生像样的成绩,而且是计算上更便宜。

 公共双cosineInterpolation(双X1,X2双,双正常)
{
    双英尺=正常* 3.1415927;
    双F =(1  -  Math.cos(英尺))* 0.5;
    回报X1 *(1  -  F)+ X2 * F;
}
 

您将需要调用此方法两次;一旦用于x,一旦为2的后续点的y坐标。

I tried to get all the x,y coordinates that are drawn in the path on the canvas. But i couldn't get the points. I am getting only a few points. Why is that?

Is there any way i can get all the x and y points?

I use FingerPaint.java as a starting point.

Link to Original FingerPaint.java

Here is the code i modified and using:

package com.schogini.whiteboard;

import java.util.ArrayList;
import java.util.StringTokenizer;

import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
//import android.widget.Toast;

public class FingerPaint extends Activity  implements ColorPickerDialog.OnColorChangedListener {
    //color - ARGB
    int a = 255;
    int r = 255;
    int g = 0;
    int b = 0;

    //erase Flag
    boolean eraseFlag=false;
    //Internet Posting
    static String toSend;
    static String parseStr;

    //array for storing x,y,r,g,b,a
    static ArrayList<String> rArray,gArray,bArray,alphaArray,xPointArray,yPointArray;
    //ArrayList<String> rArray_in,gArray_in,bArray_in,alphaArray_in,xPointArray_in,yPointArray_in;

    //Drawing types
    private static Paint mPaint;
    private MaskFilter  mEmboss;
    private MaskFilter  mBlur;

    //touch - Path Coordinates
    private static float mX;
    private static float mY;

    //MyView object
    MyView m;

    //point populate
    float dx,dy,distance;
    int dd,ii;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        m = new MyView(FingerPaint.this);
        setContentView(m);

        //move to appropriate module
        rArray = new ArrayList<String>(); 
        gArray = new ArrayList<String>();
        bArray = new ArrayList<String>();
        alphaArray = new ArrayList<String>();
        xPointArray = new ArrayList<String>();
        yPointArray = new ArrayList<String>();

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(0xFFFF0000);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);

        //width of the drawing brush
        mPaint.setStrokeWidth(12);

        mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f);
        mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
    }

    public void parsing(String str22){
         //example string received from server
//      parseStr = "255,0,0,1.0,88.0,100.0||255,0,0,1.0,88.0,101.0||255,0,0,1.0,88.0,102.0||255,0,0,1.0,88.0,103.0||255,0,0,1.0,88.0,104.0||255,0,0,1.0,88.0,105.0||255,0,0,1.0,88.0,106.0||255,0,0,1.0,88.0,107.0||255,0,0,1.0,88.0,108.0," +
//              "||255,0,0,1.0,88.0,109.0||255,0,0,1.0,88.0,110.0||255,0,0,1.0,88.0,111.0||255,0,0,1.0,88.0,112.0||255,0,0,1.0,88.0,113.0||255,0,0,1.0,88.0,114.0||255,0,0,1.0,88.0,115.0||255,0,0,1.0,88.0,116.0||255,0,0,1.0,88.0,117.0," +
//              "||255,0,0,1.0,88.0,118.0||255,0,0,1.0,88.0,119.0||255,0,0,1.0,88.0,120.0||255,0,0,1.0,80.0,100.0||255,0,0,1.0,81.0,100.0||255,0,0,1.0,82.0,100.0||255,0,0,1.0,83.0,100.0||255,0,0,1.0,84.0,100.0||255,0,0,1.0,85.0,100.0," +
//              "||255,0,0,1.0,86.0,100.0||255,0,0,1.0,87.0,100.0||255,0,0,1.0,88.0,100.0||255,0,0,1.0,89.0,100.0||255,0,0,1.0,91.0,100.0||255,0,0,1.0,92.0,100.0||255,0,0,1.0,93.0,100.0||255,0,0,1.0,94.0,100.0||255,0,0,1.0,95.0,100.0," +
//              "||255,0,0,1.0,96.0,100.0||255,0,0,1.0,97.0,100.0||255,0,0,1.0,98.0,100.0||255,0,0,1.0,99.0,100.0||255,0,0,1.0,100.0,100.0||255,0,0,1.0,101.0,100.0||255,0,0,1.0,102.0,100.0||255,0,0,1.0,103.0,100.0,";
        parseStr="255,0,0,255,85.351585,90.17996||255,0,0,255,85.351585,90.17996||255,0,0,255,123.97784,80.883064||255,0,0,255,164.47311,71.58616||255,0,0,255,182.22874,65.543175||255,0,0,255,233.9381,48.3439||255,0,0,255,247.95567,42.30091||255,0,0,255,252.62822,40.441532||255,0,0,255,252.62822,40.441532||255,0,0,255,86.9091,167.34427||255,0,0,255,86.9091,167.34427||255,0,0,255,86.9091,167.34427||255,0,0,255,151.70154,133.41057||255,0,0,255,190.3278,118.07068||255,0,0,255,235.18411,98.54717||255,0,0,255,248.57867,92.03935||255,0,0,255,256.36627,89.71512||255,0,0,255,257.30078,89.250275||255,0,0,255,257.30078,89.250275||255,0,0,255,82.548065,277.97742||255,0,0,255,82.548065,277.97742||255,0,0,255,82.548065,277.97742||255,0,0,255,116.50179,258.91876||255,0,0,255,152.63605,240.7898||255,0,0,255,209.95244,215.68816||255,0,0,255,239.23363,199.41858||255,0,0,255,249.8247,192.4459||255,0,0,255,261.35028,186.86777||255,0,0,255,261.9733,186.86777||255,0,0,255,261.9733,186.86777||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,50.77485,53.92204||255,0,0,255,48.905834,62.7541||255,0,0,255,39.56077,133.87541||255,0,0,255,44.856304,185.93808||255,0,0,255,53.578365,266.82114||255,0,0,255,53.578365,287.27435||255,0,0,255,51.70935,301.6845||255,0,0,255,51.39785,303.07904||255,0,0,255,51.086346,303.5439||255,0,0,255,51.086346,303.5439||255,0,0,255,90.02411,362.57922||255,0,0,255,88.155106,355.14172||255,0,0,255,109.02575,317.0244||255,0,0,255,133.01141,323.53226||255,0,0,255,155.43958,340.26666||255,0,0,255,166.65363,344.91513||255,0,0,255,185.03226,338.4073||255,0,0,255,193.13133,326.78616||255,0,0,255,210.26395,292.38763||255,0,0,255,228.01956,296.10638||255,0,0,255,259.7928,283.09073||255,0,0,255,266.33432,263.5672||255,0,0,255,267.58032,258.91876||255,0,0,255,269.76086,256.1297||255,0,0,255,271.94138,255.20001||255,0,0,255,284.71295,248.22733||255,0,0,255,294.3695,232.42259||255,0,0,255,297.48453,212.8991||255,0,0,255,297.48453,212.8991||255,0,0,255,101.86119,202.67252||255,0,0,255,101.86119,202.67252||255,0,0,255,101.86119,202.67252||255,0,0,255,113.07527,194.77013||255,0,0,255,141.73346,178.9654||255,0,0,255,144.8485,179.43024||255,0,0,255,166.96513,192.4459||255,0,0,255,170.70317,195.23497||255,0,0,255,193.75432,195.69983||255,0,0,255,201.85338,185.93808||255,0,0,255,212.75597,146.42624||255,0,0,255,217.4285,136.19965||255,0,0,255,231.44609,135.26996||255,0,0,255,241.41415,136.66449||255,0,0,255,250.13622,136.19965||255,0,0,255,279.41742,128.76212||255,0,0,255,312.12512,100.406555||255,0,0,255,312.12512,100.406555||255,0,0,255,92.20462,52.527508||255,0,0,255,92.20462,52.527508||255,0,0,255,159.48909,44.160294||255,0,0,255,186.90128,34.398544||255,0,0,255,242.97165,20.918034||255,0,0,255,269.13785,13.48051||255,0,0,255,288.76245,11.62113||255,0,0,255,288.76245,11.62113,";

        StringTokenizer tokens = new StringTokenizer(parseStr, "||");
        while(tokens.hasMoreTokens())
        {
            String second = tokens.nextToken();
            StringTokenizer tempTokens = new StringTokenizer(second, ",");
            int index = 0;
            while(tempTokens.hasMoreTokens())
            {
                String splitStr = tempTokens.nextToken();
                switch (index%6) {
                case 0:
                    rArray.add(splitStr);
                    break;
                case 1:
                    gArray.add(splitStr);
                    break;
                case 2:
                    bArray.add(splitStr);
                    break;
                case 3:
                    alphaArray.add(splitStr);
                    break;
                case 4:
                    xPointArray.add(splitStr);
                    break;
                case 5:
                    yPointArray.add(splitStr);
                    break;
                default:
                    break;
                }
                index++;
                Log.v("String44"," value = "+splitStr);
            }
        }
        m.redraw();
    }

    public void colorChanged(int color) {
        mPaint.setColor(color);

        //method to convert integer color to r g b a
        b = (color)&0xFF;
        g = (color>>8)&0xFF;
        r = (color>>16)&0xFF;
        a = Math.round(((color>>>24)/255)*10);
    }

    public class MyView extends View {

        private Bitmap mBitmap;
        private Canvas mCanvas;
        public Path mPath;
        public Paint mBitmapPaint;

        public MyView(Context c) {
            super(c);

            // reading screen size (for device Independence)
            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);

            mBitmap = Bitmap.createBitmap(displaymetrics.widthPixels,displaymetrics.heightPixels, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            //background -- White
            canvas.drawColor(0xFFFFFFFF);

            //draw the bitmap from 0,0 the firstpoint in device's screen
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
            canvas.drawPath(mPath, mPaint);
        }

        public void touch_start(float x, float y) {
            //reset touch so that a new path is to be drawn
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }

        public void touch_move(float x, float y) {
            mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);


            //point tracing
            tracePoints((int)x, (int)y,(int)mX,(int)mY);
            mX = x;
            mY = y;
        }

        public void touch_up() {
            mPath.lineTo(mX, mY);
            // commit the path to our offscreen
            mCanvas.drawPath(mPath, mPaint);
            // kill this so we don't double draw
            mPath.reset();
        }

        public void arrayPopulate(float atx,float aty){

            if(eraseFlag==false){
                //entering points into arrayLists
                xPointArray.add(""+atx); 
                yPointArray.add(""+aty);

                //add color as well
                alphaArray.add(""+a); 
                rArray.add(""+r);
                gArray.add(""+g); 
                bArray.add(""+b);

//              if(toSend==null){
//                  toSend=""+r+","+g+","+b+","+a+","+atx+","+aty+"||";
//              }
//              else{
//                  toSend+=""+r+","+g+","+b+","+a+","+atx+","+aty+"||";
//              }

                //add data to a queue for sending to server

               // Log.v("touch", toSend);
                //send data here to server
                //eraseFlag is true ends
            }
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX();
            float y = event.getY();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touch_start(x, y);
                    arrayPopulate(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    touch_move(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    touch_up();
                    arrayPopulate(x, y);
                    invalidate();
                    break;
            }
            return true;
        }

        public void redraw() {
            int arraysize = FingerPaint.rArray.size();

            int index=0;
            float xx,yy;

            //setting properties of tPaint
            Paint tPaint= new Paint();
            tPaint.setAntiAlias(true);
            tPaint.setDither(true);
            tPaint.setStyle(Paint.Style.STROKE);
            tPaint.setStrokeJoin(Paint.Join.ROUND);
            tPaint.setStrokeCap(Paint.Cap.ROUND);
            tPaint.setColor(-16777216);
            tPaint.setStrokeWidth(12);

            while(index<arraysize){
                    //tPaint.setARGB(Integer.parseInt(alphaArray.get(0)), Integer.parseInt(rArray.get(0)), Integer.parseInt(gArray.get(0)), Integer.parseInt(bArray.get(0)));
                    //tPaint.setColor(Color.argb(Integer.parseInt(alphaArray.get(0)), Integer.parseInt(rArray.get(0)), Integer.parseInt(gArray.get(0)), Integer.parseInt(bArray.get(0))));

                    xx=Float.parseFloat(xPointArray.get(index));
                    yy=Float.parseFloat(yPointArray.get(index));

                    m.mCanvas.drawPoint(xx,yy,tPaint);
                    m.invalidate();
                    index++;
                    Log.d("__REDRAW__", "X="+xx+"   Y="+yy);
              }
        }
    }

    //creating Options Menu - Inflater
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
    }

    //Option Menu Selection - Actions
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        mPaint.setXfermode(null);
        mPaint.setAlpha(255);

        switch (item.getItemId()) {
            case R.id.COLOR:
                this.eraseFlag=false;
                new ColorPickerDialog(this, this, mPaint.getColor()).show();
                return true;
            case R.id.EMBOSS:
                this.eraseFlag=false;
                if (mPaint.getMaskFilter() != mEmboss) {
                    mPaint.setMaskFilter(mEmboss);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case R.id.BLUR:
                this.eraseFlag=false;
                if (mPaint.getMaskFilter() != mBlur) {
                    mPaint.setMaskFilter(mBlur);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case R.id.ERASE:
                //for toggle detection
                this.eraseFlag=true;
                //reset blurr & Emboss
                mPaint.setMaskFilter(null);
                mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                return true;
            case R.id.REDRAW:
                this.eraseFlag=false;
                //redraw the drawn points
                m.redraw();
                return true;
        }
       return super.onOptionsItemSelected(item);
    }

    //Bressenham's mid-point algorithm for finding all points between any two points --- Straight line
    public void tracePoints(int xxx,int yyy,int x2, int y2) {
        int w = x2 - xxx ;
        int h = y2 - yyy ;
        int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ;
        if (w<0) dx1 = -1 ; else if (w>0) dx1 = 1 ;
        if (h<0) dy1 = -1 ; else if (h>0) dy1 = 1 ;
        if (w<0) dx2 = -1 ; else if (w>0) dx2 = 1 ;
        int longest = Math.abs(w) ;
        int shortest = Math.abs(h) ;
        if (!(longest>shortest)) {
            longest = Math.abs(h) ;
            shortest = Math.abs(w) ;
            if (h<0) dy2 = -1 ; else if (h>0) dy2 = 1 ;
            dx2 = 0 ;            
        }
        int numerator = longest >> 1 ;
        for (int i=0;i<=longest;i++) {
            m.arrayPopulate((float)xxx,(float)yyy) ;
            numerator += shortest ;
            if (!(numerator<longest)) {
                numerator -= longest ;
                xxx += dx1 ;
                yyy += dy1 ;
            } else {
                xxx += dx2 ;
                yyy += dy2 ;
            }
        }
    }
}

解决方案

You need to interpolate to find the points between updates. I recommend cosine interpolation. Its easy to implement, produces decent results, and is computationally inexpensive.

public double cosineInterpolation(double x1, double x2, double normal)
{
    double ft = normal * 3.1415927;
    double f = (1 - Math.cos(ft)) * .5;
    return  x1 * (1 - f) + x2 * f;
}

You'll need to call this method twice; once for the x, and once for the y coordinates of 2 subsequent points.

这篇关于让所有点在机器人路径 - FingerPaint.java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆