有什么方法可以得到所有的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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)