drawPath在reciving end canvas android上获得不相交的段

时间:2017-04-20 07:32:49

标签: android canvas path drawing

我正在尝试基于画布写入实时应用程序这里多个设备将与此应用程序连接如果我在画布上写东西它应该反映在与此应用程序连接的其他设备这里我的问题是我能够写在画布上,它也写得很流畅,但是当它接收到它的不相交的片段时,在画布上看不到清晰的路径。

我正在使用线程moveTo()quadTo()来接收服务器点

此处供参考 Source writing Receiving end

这是我正在尝试的代码

onDraw方法

 @Override
            protected void onDraw(final Canvas canvas) {
                normal_canvas_draw=true;
                bckimage = getBackground();
                String col = "#333333".substring(1);
                col = col.toLowerCase();
                col = "#ff" + col;

                mc.setcanvas(canvas);

                paint1.setAntiAlias(true);
                paint1.setDither(true);
                paint1.setStyle(Paint.Style.STROKE);
                paint1.setStrokeJoin(Paint.Join.ROUND);
                paint1.setStrokeCap(Paint.Cap.ROUND);
                paint1.setPathEffect(new CornerPathEffect(30) );   // set the path effect when they join.


                paint.setDither(true);                    // set the dither to true
                paint.setStyle(Paint.Style.STROKE);       // set to STOKE
                paint.setStrokeJoin(Paint.Join.ROUND);    // set the join to round you want
                paint.setStrokeCap(Paint.Cap.ROUND);      // set the paint cap to round too
                paint.setPathEffect(new CornerPathEffect(30) );   // set the path effect when they join.
                paint.setAntiAlias(true);


                    mCanvas.drawPath(path, paint);
                    mCanvas.drawPath(path1, paint1);


    /*
                for(Path p :paths)
                {
                    mCanvas.drawPath(p, paint1);
                }*/

                //mCanvas.drawPath(path1, paint1);

                //s = paths.size();
                s = type.size();
                Log.d("BLOCK", s + " , " + leftval.size());
                int j = 0, k = 0;

                canvas.drawBitmap(img, 0, 0, null);
                canvas.drawText(mc.getDisplaymsg(), mCanvas.getWidth()-200, 25, painttext);

                r = new Rect(10, 600, 100, 650);
            }

的onTouchEvent

@Override
        public boolean onTouchEvent(MotionEvent event) {

            if (mIsScrolling)
                sv.requestDisallowInterceptTouchEvent(false);
            else
                sv.requestDisallowInterceptTouchEvent(true);

            float eventX = event.getX();
            float eventY = event.getY();
            boolean touchcaptured = false;

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:

                     path.reset();


//                    path.moveTo(eventX, eventY);
                    boolean l = r.contains((int) event.getX(), (int) event.getY());


                    if (markerMode)
                    {
                        isEraserDown="false";
                        isPenDown="false";
                        isMarkerDown="true";
                        path.moveTo(eventX,eventY);
                        startX=eventX/scalefactor;
                        startY=eventY/scalefactor;
                        mX=eventX;
                        mY=eventY;
                        MainActivity.super.loadUrl("javascript:eraserfunction(" + eventX / scalefactor + "," + eventY / scalefactor + "," + mc.getdrawAttributes1() + ")");
                    }

                    else if (eraseMode)
                    {
                        isEraserDown="true";
                        isPenDown="false";
                        isMarkerDown="false";
                        System.out.println("--Eraserfromtouch");
                        path.moveTo(eventX,eventY);
                        startX=eventX/scalefactor;
                        startY=eventY/scalefactor;
                        mX=eventX;
                        mY=eventY;
                        MainActivity.super.loadUrl("javascript:eraserfunction(" + eventX / scalefactor + "," + eventY / scalefactor + "," + mc.getdrawAttributes1() + ")");
                    }

                    else if (blockerase) {
//                        left=(int) event.getX();
//                        right=left+1;
//                        top=(int) event.getY();
//                        bottom=top+1;
                        rx = (int) event.getX();
                        ry = (int) event.getY();
                    }

                    /*------------------- Pendown when we touch on mobile screen------*/
                    else if (penmode) {
                        isPenDown="true";
                        isEraserDown="false";
                        isMarkerDown="false";
                        System.out.println("---pen-down---"+eventX+","+eventY);
                        int historySize = event.getHistorySize();

                if(isPenDown=="true")
                {
                    path.moveTo(eventX,eventY);
                    mX = eventX;
                    mY = eventY;
                    startX=eventX/scalefactor;
                    startY=eventY/scalefactor;
                    mc.setXY(eventX / scalefactor, eventY / scalefactor);
                    MainActivity.super.loadUrl("javascript:penDown(0,0,'pen')");
                }
                else
                {

                }

                       // System.out.println(" Lcal x"+eventX+" y"+eventY+" x2"+eventX+" y2"+eventY);
                    } else if (rectanglemode) {
                        rx = (int) event.getX();
                        ry = (int) event.getY();
                    } else if (linemode) {
                        rx = (int) event.getX();
                        ry = (int) event.getY();
                    } else if (circlemode) {
                        cx = (int) event.getX();
                        cy = (int) event.getY();
                        MainActivity.super.loadUrl("javascript:circleDown(" + cx / scalefactor + "," + cy / scalefactor + ")");
                    } else if (textmode) {
                        cx = (int) event.getX();
                        cy = (int) event.getY();
                        //MainActivity.super.loadUrl("javascript:drawtext(" +cx + "," + cy+","+"Hello World"+")");
                    }
                    //invalidate();
                    break;

                case MotionEvent.ACTION_MOVE:

                    if (markerMode) {
                        if (isMarkerDown.equals("true")) {
                            System.out.println("Marker Move");
                            Log.d("MARKER", "Hi im marker");
                            String col = mc.getdrawAttributes().substring(1);
                            col = col.toLowerCase();
                            col = "#ff" + col;
                            int coll = Color.parseColor(col);
                            paint.setColor(coll);
                            paint.setAlpha(10);
                            paint.setStrokeWidth(20);
                            if (bckimage == null) {

                            } else {
                                paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));
                            }
                            MainActivity.super.loadUrl("javascript:marker1(" + eventX / scalefactor + "," + eventY / scalefactor + ")");
                        }
                        else{

                        }
                        path.quadTo(mX,mY,(mX+event.getX())/2,(mY+event.getY())/2);

                        mX=event.getX();
                        mY=event.getY();
                    }
                    else if (eraseMode)
                    {
                        if(isEraserDown=="true")
                        {
                            System.out.println("--Eraserfromtouch--MOVE");

                            System.out.println("Marker Move");
                            Log.d("Eraser", "Im eraser");

                            String thh = mc.getdrawAttributes1();
                            float f = Float.parseFloat(thh);
                            paint.setStrokeWidth(f);

                            if (bckimage == null) {
                                paint.setColor(Color.WHITE); //Toast.makeText(getContext(),"ERASE",Toast.LENGTH_LONG).show();

                            } else {
                                // setLayerType(View.LAYER_TYPE_SOFTWARE, paint);
                                paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
                                MainActivity.super.loadUrl("javascript:eraserfunction1(" + eventX / scalefactor + "," + eventY / scalefactor + "," + mc.getdrawAttributes1() + ")");

                            }

                            path.quadTo(mX,mY,(mX+event.getX())/2,(mY+event.getY())/2);

                            mX=event.getX();
                            mY=event.getY();
                        }
                        else
                        {

                        }

                    }

                    else if (blockerase) {

                        qx = (int) event.getX();
                        qy = (int) event.getY();
                    }

                    /*------------------Pen move on the screen following by finger-------------*/
                    else if (penmode) {

                        if(isPenDown=="true")
                        {

                            String thh1 = mc.getdrawAttributes1();
                            float width = Float.parseFloat(thh1);
                            paint.setStrokeWidth(width);
                            paint.setColor(color);
                            paint.setDither(true);                    // set the dither to true
                            paint.setStyle(Paint.Style.STROKE);       // set to STOKE
                            paint.setStrokeJoin(Paint.Join.ROUND);    // set the join to round you want
                            paint.setStrokeCap(Paint.Cap.ROUND);      // set the paint cap to round too
                            paint.setPathEffect(new CornerPathEffect(30) );   // set the path effect when they join.
                            paint.setAntiAlias(true);


                            //  Line current = lines.get(lines.size() - 1);
                            System.out.println("---penmove---");

                            float dx = Math.abs((int) event.getX() - mX);
                            float dy = Math.abs((int) event.getY() - mY);
                            System.out.println("--Value of dx-dy-"+dx+"-"+dy);
                            if (dx >= 4 || dy >= 4) {
                                // setXY function set X and Y values to be used in JS File
                                mc.setXY((int) event.getX() / scalefactor, (int) event.getY() / scalefactor);

                                MainActivity.super.loadUrl("javascript:penMove(0,0,'pen')");
                               path.quadTo(mX,mY,(mX+event.getX())/2,(mY+event.getY())/2);

                                mX=event.getX();
                                mY=event.getY();

                        }
                        else
                        {

                        }

                        }
                    } else if (rectanglemode) {
                        qx = (int) event.getX();
                        qy = (int) event.getY();

                    } else if (linemode) {
                        qx = (int) event.getX();
                        qy = (int) event.getY();

                    } else if (circlemode) {
                        //MainActivity.super.loadUrl("javascript:circleDown(" + eventX + "," + eventY + ")");
                    }

                    break;

                case MotionEvent.ACTION_UP:
                    boolean ll = r.contains((int) event.getX(), (int) event.getY());

                    if (markerMode)
                        MainActivity.super.loadUrl("javascript:marker12()");
                    else if (eraseMode) {
                        MainActivity.super.loadUrl("javascript:penUp()");
                        isEraserDown="false";
                        isMarkerDown="false";
                        System.out.println("--Eraserfromtouch---actionup");
                        path.lineTo(mX,mY);
                        mCanvas.drawPath(path,paint);
                        path= new Path();
                        // path1= new Path();
                        paths.add(path);
                      //  MainActivity.super.loadUrl("javascript:eraserfunction1(" + eventX / scalefactor + "," + eventY / scalefactor + "," + mc.getdrawAttributes1() + ")");
                    }else if (blockerase) {

                        qx = (int) event.getX();
                        qy = (int) event.getY();
                        MainActivity.super.loadUrl("javascript:bigeraserfunction1(" + rx / scalefactor + "," + ry / scalefactor + "," + qx / scalefactor + "," + qy / scalefactor + ")");
                    }
                    /*---------------------Pen up for writing on canvas------------------*/

                    else if (penmode) {
                        MainActivity.super.loadUrl("javascript:penUp()");
                        isPenDown="false";
                        System.out.println("---pen--up---");
                       path.lineTo(mX,mY);
                       mCanvas.drawPath(path,paint);
                        path= new Path();
                       // path1= new Path();
                        paths.add(path);


                    } else if (rectanglemode) {
                        qx = (int) event.getX();
                        qy = (int) event.getY();
                        MainActivity.super.loadUrl("javascript:rectangle(" + rx / scalefactor + "," + ry / scalefactor + "," + qx / scalefactor + "," + qy / scalefactor + ",'" + Prefs.getString(Elucido_APP_CONSTANTS.shared_user_name, "") + "')");
                    } else if (linemode) {
                        qx = (int) event.getX();
                        qy = (int) event.getY();
                        MainActivity.super.loadUrl("javascript:line(" + rx / scalefactor + "," + ry / scalefactor + "," + qx / scalefactor + "," + qy / scalefactor + ",'" + Prefs.getString(Elucido_APP_CONSTANTS.shared_user_name, "") + "')");
                    } else if (circlemode) {
                        c1x = (int) event.getX();
                        c1y = (int) event.getY();

                        MainActivity.super.loadUrl("javascript:circleup(" + c1x / scalefactor + "," + c1y / scalefactor + ")");
                    } else if (textmode) {
                        cx = (int) event.getX();
                        cy = (int) event.getY();
                        opentextDialog((int) (cx / scalefactor), (int) (cy / scalefactor));
                    }

                    break;

                default:

                    return false;
            }


            invalidate();
            return true;
        }

draw()方法是在线程中连续接收点路径

   public boolean draw() {
//------------------------ Starting Reciving points--------------------------
            String s1 = mc.getdrawlinesdual();
            words1 = s1.split(",");

            float xx11 = Float.parseFloat(words1[0].replaceAll("[\\(\\)\\[\\]\\{\\}]", "")) * scalefactor;
            float yy11 = Float.parseFloat(words1[1]) * scalefactor;
            float xx21 = Float.parseFloat(words1[2]) * scalefactor;
            float yy21 = Float.parseFloat(words1[3].replaceAll("[\\(\\)\\[\\]\\{\\}]", "")) * scalefactor;


            System.out.println("---------x" + xx11 + " y" + yy11 + " x2" + xx21 + " y2" + yy21);

            if (a1 == 0)
            {
                System.out.println("----paint from pen--a1 == 0");
                Log.d("TAGG", "INTEGER value " + mc.getdrawAttributes());

                if (mc.getdrawTypeAttributes().toString().compareTo("eraser") == 0) {
                    System.out.println("Eraser--a1==0---ifllop");
                    Log.d("Eraser", "Im eraser");
                    String thh = mc.getdrawThAttributes();
                    float f = Float.parseFloat(thh);
                    paint1.setStrokeWidth(f);
                    if (bckimage == null) {
                        paint1.setColor(Color.WHITE); //Toast.makeText(getContext(),"ERASE",Toast.LENGTH_LONG).show();
                    } else {
                        paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
                    }
                } else {
                    System.out.println("Eraser--a1==0---elsellop");
                    String th = mc.getdrawThAttributes();
                    float f = Float.parseFloat(th);
                    paint1.setColor(color);
                }

                String t = mc.getdrawTypeAttributes().trim();
                if ((t.compareTo("marker") == 0)) {

                    Log.d("MARKER", "Hi im marker");
                    String col = mc.getdrawColorAttributes().substring(1);
                    col = col.toLowerCase();
                    col = "#ff" + col.trim();
                    int coll = Color.parseColor(col);
                    paint1.setColor(coll);
                    paint1.setAlpha(10);
                    paint1.setStrokeWidth(20);
                    if (bckimage == null) {
                    } else {
                        paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));
                    }
                }
                path1.moveTo(xx11, yy11);
                //  path1.lineTo(xx21, yy21);
                path1.quadTo(xx11, yy11, (xx11 + xx21) / 2, (yy11 + yy21) / 2);
                //  invalidate();
                // type.add("Line");
                path1 = new Path();
                a1 = xx11;
                b1 = yy11;
                c1 = xx21;
                d1 = yy21;
            }
            else if (a1 == xx11)
            {

                //il.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
                System.out.println("----paint from pen--a1 == xx11");
                MainActivity.this.blankwhiteboard = 1;
                path1.moveTo(c1, d1);
//                float x = c+(xx2-c)/2;
//                float y= d+(yy2-d)/2;
                path1.quadTo(c1, d1, (c1 + xx21) / 2, (d1 + yy21) / 2);

                // path1.lineTo(xx21, yy21);
                 invalidate();
                c1 = xx21;
                d1 = yy21;

            }
            else
            {

                type.add("Line");
                System.out.println("----paint from pen");
                path1 = new Path();
                paint1 = new Paint();
                paint1.setAntiAlias(true);
                String th = mc.getdrawThAttributes();

                paint1.setStyle(Paint.Style.STROKE);
                paint1.setStrokeJoin(Paint.Join.ROUND);
                paint1.setStrokeCap(Paint.Cap.ROUND);
                paint1.setPathEffect(new CornerPathEffect(30));
                paint1.setDither(true);

                String t = mc.getdrawTypeAttributes();
                if (mc.getdrawTypeAttributes().toString().compareTo("eraser") == 0)
                {
                    System.out.println("Eraser--a1!=0---ifllop");
                    System.out.println("inside cuming erase");
                    //float val = 20;
                    String thh = mc.getdrawThAttributes();
                    float f = Float.parseFloat(thh);
                    paint1.setStrokeWidth(f);
                    Log.d("Eraser", "Im in eraser");
                    if (bckimage == null) {
                        paint1.setColor(Color.WHITE); //Toast.makeText(getContext(),"ERASE",Toast.LENGTH_LONG).show();
                    } else
                        paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
                    invalidate();
                }
                else
                {
                    System.out.println("Eraser--a1!=0---elsellop");
                    float f = Float.parseFloat(th);
                    paint1.setStrokeWidth(f);
                    String col = mc.getdrawColorAttributes().substring(1);
                    col = col.toLowerCase();
                    col = "#ff" + col;
                    int coll = Color.parseColor(col);
                    paint1.setColor(coll);
                    if ((t.compareTo("marker") == 0))
                    {
                        Log.d("MARKER", "Hi im marker");
                        paint1.setAlpha(10);
                        paint1.setStrokeWidth(20);
                        if (bckimage == null)
                        {

                        }
                        else
                        {
                                paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));
                        }
                      paint1.setStrokeWidth(f);
                      mc.getTelephoneNumber(Integer.toHexString(color).substring(2));
                      MainActivity.super.loadUrl("javascript:colorSelectListener('')");
                    }
                  else
                    {

                    }
                }


                path1.moveTo(xx11, yy11);
              //  path1.lineTo(xx21,yy21);
               path1.quadTo(xx11, yy11, (xx11 + xx21) / 2, (yy11 + yy21) / 2);

                a1 = xx11;
                b1 = yy11;
                c1 = xx21;
                d1 = yy21;
            }
            invalidate();



//------------------------ End Reciving points--------------------------
}

0 个答案:

没有答案