在android中获取Path中的所有点 – FingerPaint.java

在android中获取Path中的所有点 – FingerPaint.java,第1张

概述我试图获得在画布上的路径中绘制的所有x,y坐标.但我无法得到积分.我只得到几点.这是为什么? 有什么方法可以得到所有的x和y点吗? 我使用FingerPaint.java作为起点. Link to Original FingerPaint.java 这是我修改和使用的代码: package com.schogini.whiteboard;import java.util.ArrayList; 我试图获得在画布上的路径中绘制的所有x,y坐标.但我无法得到积分.我只得到几点.这是为什么?

有什么方法可以得到所有的x和y点吗?

我使用FingerPaint.java作为起点.

Link to Original FingerPaint.java

这是我修改和使用的代码:

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,1.0,88.0,100.0||255,101.0||255,102.0||255,103.0||255,104.0||255,105.0||255,106.0||255,107.0||255,108.0," +//              "||255,109.0||255,110.0||255,111.0||255,112.0||255,113.0||255,114.0||255,115.0||255,116.0||255,117.0,118.0||255,119.0||255,120.0||255,80.0,81.0,82.0,83.0,84.0,85.0,100.0,86.0,87.0,89.0,91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,101.0,102.0,103.0,";        parseStr="255,255,85.351585,90.17996||255,123.97784,80.883064||255,164.47311,71.58616||255,182.22874,65.543175||255,233.9381,48.3439||255,247.95567,42.30091||255,252.62822,40.441532||255,86.9091,167.34427||255,151.70154,133.41057||255,190.3278,118.07068||255,235.18411,98.54717||255,248.57867,92.03935||255,256.36627,89.71512||255,257.30078,89.250275||255,82.548065,277.97742||255,116.50179,258.91876||255,152.63605,240.7898||255,209.95244,215.68816||255,239.23363,199.41858||255,249.8247,192.4459||255,261.35028,186.86777||255,261.9733,50.77485,53.92204||255,48.905834,62.7541||255,39.56077,133.87541||255,44.856304,185.93808||255,53.578365,266.82114||255,287.27435||255,51.70935,301.6845||255,51.39785,303.07904||255,51.086346,303.5439||255,90.02411,362.57922||255,88.155106,355.14172||255,109.02575,317.0244||255,133.01141,323.53226||255,155.43958,340.26666||255,166.65363,344.91513||255,185.03226,338.4073||255,193.13133,326.78616||255,210.26395,292.38763||255,228.01956,296.10638||255,259.7928,283.09073||255,266.33432,263.5672||255,267.58032,269.76086,256.1297||255,271.94138,255.20001||255,284.71295,248.22733||255,294.3695,232.42259||255,297.48453,212.8991||255,101.86119,202.67252||255,113.07527,194.77013||255,141.73346,178.9654||255,144.8485,179.43024||255,166.96513,170.70317,195.23497||255,193.75432,195.69983||255,201.85338,212.75597,146.42624||255,217.4285,136.19965||255,231.44609,135.26996||255,241.41415,136.66449||255,250.13622,279.41742,128.76212||255,312.12512,100.406555||255,92.20462,52.527508||255,159.48909,44.160294||255,186.90128,34.398544||255,242.97165,20.918034||255,269.13785,13.48051||255,288.76245,11.62113||255,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,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+","+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(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 ;            }        }    }}
解决方法 请尝试以下代码.我希望它能解决你的问题.当我画画的时候,无论我是画得还是画得很快,我都会得到所有的分数.

public class HRCanvas extends Activity implements OntouchListener{        DrawPanel dp;        private ArrayList<Path> pointsToDraw = new ArrayList<Path>();        private Paint mPaint;        Path path;        @OverrIDe        protected voID onCreate(Bundle savedInstanceState) {            // Todo auto-generated method stub            super.onCreate(savedInstanceState);            dp = new DrawPanel(this);            dp.setontouchListener(this);            getwindow().setFlags(WindowManager.LayoutParams.FLAG_FulLSCREEN,WindowManager.LayoutParams.FLAG_FulLSCREEN);            requestwindowFeature(Window.FEATURE_NO_@R_301_5979@);            mPaint = new Paint();            mPaint.setDither(true);            mPaint.setcolor(color.WHITE);            mPaint.setStyle(Paint.Style.stroke);            mPaint.setstrokeJoin(Paint.Join.ROUND);            mPaint.setstrokeCap(Paint.Cap.ROUND);            mPaint.setstrokeWIDth(30);            FrameLayout fl = new FrameLayout(this);              fl.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));              fl.addVIEw(dp);              setContentVIEw(fl);          }        @OverrIDe        protected voID onPause() {            // Todo auto-generated method stub            super.onPause();            dp.pause();        }        @OverrIDe        protected voID onResume() {            // Todo auto-generated method stub            super.onResume();            dp.resume();        }        public class DrawPanel extends SurfaceVIEw implements Runnable{            Thread t = null;            SurfaceHolder holder;            boolean isItOk = false ;            public DrawPanel(Context context) {                super(context);                // Todo auto-generated constructor stub                holder = getHolder();            }            @OverrIDe            public voID run() {                // Todo auto-generated method stub                while( isItOk == true){                    if(!holder.getSurface().isValID()){                        continue;                    }                    Canvas c = holder.lockCanvas();                    c.drawARGB(255,0);                    onDraw(c);                    holder.unlockCanvasAndPost(c);                }            }            @OverrIDe            protected voID onDraw(Canvas canvas) {                // Todo auto-generated method stub                super.onDraw(canvas);                            synchronized(pointsToDraw)                            {                for (Path path : pointsToDraw) {                    canvas.drawPath(path,mPaint);                }                            }            }            public voID pause(){                isItOk = false;                while(true){                    try{                        t.join();                    }catch(InterruptedException e){                        e.printstacktrace();                    }                    break;                }                t = null;            }            public voID resume(){                isItOk = true;                  t = new Thread(this);                t.start();            }        }        @OverrIDe        public boolean ontouch(VIEw v,MotionEvent me) {            // Todo auto-generated method stub                    synchronized(pointsToDraw)                    {            if(me.getAction() == MotionEvent.ACTION_DOWN){                path = new Path();                path.moveto(me.getX(),me.getY());                //path.lineto(me.getX(),me.getY());                pointsToDraw.add(path);            }else if(me.getAction() == MotionEvent.ACTION_MOVE){                path.lineto(me.getX(),me.getY());            }else if(me.getAction() == MotionEvent.ACTION_UP){                //path.lineto(me.getX(),me.getY());            }            }                   return true;        }    }
总结

以上是内存溢出为你收集整理的在android中获取Path中的所有点 – FingerPaint.java全部内容,希望文章能够帮你解决在android中获取Path中的所有点 – FingerPaint.java所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1124224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存