Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中将画布点路径绘制到另一个画布中?_Java_Android_Canvas_Android Canvas - Fatal编程技术网

Java 如何在Android中将画布点路径绘制到另一个画布中?

Java 如何在Android中将画布点路径绘制到另一个画布中?,java,android,canvas,android-canvas,Java,Android,Canvas,Android Canvas,实际上我想要的是,无论何时我在第一个画布上画画或写字,它都会在第二个画布上以点而不是位图显示 原因是第二个用户会意识到另一个用户正在同一屏幕上工作。 我已经在第一个画布中存储了点和路径,但当我在另一个画布中显示该路径时,它只显示一行,而不是正确的画布 让我给你看一张它的样子。 我的第一张画布: public class CanvasView extends View { private Path mDrawPath; private Paint mBackgroundP

实际上我想要的是,无论何时我在第一个画布上画画或写字,它都会在第二个画布上以点而不是位图显示

原因是第二个用户会意识到另一个用户正在同一屏幕上工作。

我已经在第一个画布中存储了点和路径,但当我在另一个画布中显示该路径时,它只显示一行,而不是正确的画布

让我给你看一张它的样子。

我的第一张画布:

    public class CanvasView extends View {
    private Path mDrawPath;
    private Paint mBackgroundPaint;
    private Paint mDrawPaint;
    private Canvas mDrawCanvas;
    private Bitmap mCanvasBitmap, mBitmap;
    public static String XVALUE = "";
    public static String YVALUE = "";
    private static final float TOUCH_TOLERANCE = 5;
    public static ArrayList<String> mXPaths = new ArrayList<>();
    public static ArrayList<String> mYPaths = new ArrayList<>();
    private ArrayList<String> mUnXPaths = new ArrayList<>();
    private ArrayList<String> mUnYPaths = new ArrayList<>();
    private ArrayList<Path> mPaths = new ArrayList<>();
    public static  ArrayList<Path> mPaths1 = new ArrayList<>();
    private ArrayList<Paint> mPaints = new ArrayList<>();
    private ArrayList<Path> mUndonePaths = new ArrayList<>();
    private ArrayList<Paint> mUndonePaints = new ArrayList<>();
    public static ArrayList<Point> mPoints = new ArrayList<>();
    private float mX, mY;

    private int mBackgroundColor = 0xFFFFFFFF;
    private int mPaintColor = 0xFF660000;
    private int mStrokeWidth = 4;
    public CanvasView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
        mDrawPath = new Path();
        mBackgroundPaint = new Paint();
        initPaint();
    }

    private void initPaint() {
        mDrawPaint = new Paint();
        mDrawPaint.setColor(mPaintColor);
        mDrawPaint.setAntiAlias(true);
        mDrawPaint.setStrokeWidth(mStrokeWidth);
        mDrawPaint.setStyle(Paint.Style.STROKE);
        mDrawPaint.setStrokeJoin(Paint.Join.ROUND);
        mDrawPaint.setStrokeCap(Paint.Cap.ROUND);
        mDrawPaint.setDither(true);
    }

    private void drawBackground(Canvas canvas) {
        mBackgroundPaint.setColor(mBackgroundColor);
        mBackgroundPaint.setStyle(Paint.Style.FILL);
        canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), mBackgroundPaint);
    }

    private void drawPaths(Canvas canvas) {
        int i = 0;

        for (Path p : mPaths) {

            canvas.drawPath(p, mPaints.get(i));
            i++;
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
        Rect source = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        Rect bitmapRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        canvas.drawBitmap(bitmap, source, bitmapRect, new Paint());
        drawPaths(canvas);
        canvas.drawPath(mDrawPath, mDrawPaint);
    }

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

        mCanvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        mDrawCanvas = new Canvas(mCanvasBitmap);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDrawPath.moveTo(touchX, touchY);
                mX = touchX;
                mY = touchY;

                Log.e("Location", String.valueOf("x : "+ event.getX()+ "y : " +event.getY()));
                break;
            case MotionEvent.ACTION_MOVE:
                float dx = Math.abs(touchX - mX);
                float dy = Math.abs(touchY - mY);
                if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                    mDrawPath.quadTo(mX, mY, (touchX + mX) / 2, (touchY + mY) / 2);
                    mX = touchX;
                    mY = touchY;
                    Point point = new Point();
                    point.x = (int) event.getX();
                    point.y = (int)event.getY();
                    mPoints.add(point);
                    mPaths1.add(mDrawPath);
                    Log.d("Ponts Values", mPoints.toString());
                }
                break;
            case MotionEvent.ACTION_UP:
                mDrawPath.lineTo(mX, mY);
                mXPaths.add(String.valueOf(touchX));
                mYPaths.add(String.valueOf(touchY));
                mPaths.add(mDrawPath);
                mPaints.add(mDrawPaint);
                 XVALUE = mXPaths.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
                 YVALUE = mYPaths.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");

                mDrawPath = new Path();
                initPaint();
                break;
            default:
                return false;
        }

        invalidate();
        return true;
    }

    public void clearCanvas() {
        mXPaths.clear();
        mYPaths.clear();
        mPaths.clear();
        mPaints.clear();
        mUndonePaths.clear();
        mUndonePaints.clear();
        XVALUE = "";
        YVALUE = "";
        System.out.println("Cordinates X: "+XVALUE);
        System.out.println("Cordinates Y:"+YVALUE);
        mDrawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
        invalidate();
    }

    public void setPaintColor(int color) {
        mPaintColor = color;
        mDrawPaint.setColor(mPaintColor);
    }

    public void setPaintStrokeWidth(int strokeWidth) {
        mStrokeWidth = strokeWidth;
        mDrawPaint.setStrokeWidth(mStrokeWidth);
    }

    public void setBackgroundColor(int color) {
        mBackgroundColor = color;
        mBackgroundPaint.setColor(mBackgroundColor);
        invalidate();
    }

    public Bitmap getBitmap() {
        drawBackground(mDrawCanvas);
        drawPaths(mDrawCanvas);
        this.setDrawingCacheEnabled(false);
        this.setDrawingCacheEnabled(true);
        return Bitmap.createBitmap(this.getDrawingCache());


    }

    public void undo() {
        if (mPaths.size() > 0) {
            mUnXPaths.add(mXPaths.remove(mPaths.size() - 1));
            mUnYPaths.add(mYPaths.remove(mPaths.size() - 1));
            mUndonePaths.add(mPaths.remove(mPaths.size() - 1));
            mUndonePaints.add(mPaints.remove(mPaints.size() - 1));
            Log.d("X Cordinates", mXPaths.toString());
            Log.d("Y Cordinates", mYPaths.toString());
            XVALUE = mXPaths.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
            YVALUE = mYPaths.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
            System.out.println("Cordinates X: "+XVALUE);
            System.out.println("Cordinates Y:"+YVALUE);
            invalidate();
        }
    }

    public void redo() {
        if (mUndonePaths.size() > 0) {
            mXPaths.add(mUnXPaths.remove(mUnXPaths.size() - 1));
            mYPaths.add(mUnYPaths.remove(mUnYPaths.size() - 1));
            mPaths.add(mUndonePaths.remove(mUndonePaths.size() - 1));
            mPaints.add(mUndonePaints.remove(mUndonePaints.size() - 1));
            Log.d("X Cordinates", mXPaths.toString());
            Log.d("Y Cordinates", mYPaths.toString());
            XVALUE = mXPaths.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
            YVALUE = mYPaths.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
            System.out.println("Cordinates X: "+XVALUE);
            System.out.println("Cordinates Y:"+YVALUE);
            invalidate();
        }
    }
}
public类CanvasView扩展视图{
私有路径mDrawPath;
私人油漆;背景漆;
私人涂料;
私人画布;
私有位图mCanvasBitmap,mBitmap;
公共静态字符串XVALUE=“”;
公共静态字符串YVALUE=“”;
专用静态最终浮动接触公差=5;
public static ArrayList mXPaths=new ArrayList();
public static ArrayList mypath=new ArrayList();
private ArrayList munxpath=new ArrayList();
private ArrayList munypath=new ArrayList();
private ArrayList mpath=新的ArrayList();
公共静态ArrayList mPaths1=新ArrayList();
private ArrayList mPaints=new ArrayList();
private ArrayList mUndonePaths=new ArrayList();
private ArrayList mUndonePaints=new ArrayList();
public static ArrayList mPoints=new ArrayList();
私人浮动mX,我的;
私有int mBackgroundColor=0xFFFFFFFF;
私有int mPaintColor=0xFF660000;
私有int mStrokeWidth=4;
公共画布视图(上下文、属性集属性){
超级(上下文,attrs);
init();
}
私有void init(){
mBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.img1);
mDrawPath=新路径();
mBackgroundPaint=新油漆();
initPaint();
}
私有void initPaint(){
mDrawPaint=新油漆();
mDrawPaint.setColor(mPaintColor);
mDrawPaint.setAntiAlias(true);
mDrawPaint.setStrokeWidth(msStrokeWidth);
mDrawPaint.setStyle(Paint.Style.STROKE);
mDrawPaint.setStrokeJoin(绘制.连接.圆形);
mDrawPaint.setStrokeCap(油漆盖圆形);
mDrawPaint.setDither(true);
}
专用void退税场(画布){
mBackgroundPaint.setColor(mBackgroundColor);
mBackgroundPaint.setStyle(Paint.Style.FILL);
drawRect(0,0,this.getWidth(),this.getHeight(),mBackgroundPaint);
}
专用void绘图路径(画布){
int i=0;
用于(路径p:mpath){
drawPath(p,mPaints.get(i));
i++;
}
}
@凌驾
受保护的void onDraw(画布){
位图Bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.img1);
Rect source=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
Rect bitmapRect=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
drawBitmap(位图,源代码,bitmapRect,new Paint());
绘图路径(画布);
canvas.drawPath(mDrawPath,mDrawPaint);
}
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
super.onSizeChanged(w,h,oldw,oldh);
mcavasbitmap=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
mDrawCanvas=新画布(mCanvasBitmap);
}
@凌驾
公共布尔onTouchEvent(运动事件){
float touchX=event.getX();
float touchY=event.getY();
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
mDrawPath.moveTo(touchX,touchY);
mX=touchX;
我的=多愁善感;
Log.e(“Location”,String.valueOf(“x:+event.getX()+”y:+event.getY());
打破
case MotionEvent.ACTION\u移动:
float dx=Math.abs(touchX-mX);
float dy=Math.abs(touchY-mY);
如果(dx>=接触公差| | dy>=接触公差){
mDrawPath.quadTo(mX,mY,(touchX+mX)/2,(touchY+mY)/2);
mX=touchX;
我的=多愁善感;
点=新点();
point.x=(int)event.getX();
point.y=(int)event.getY();
mPoints.add(点);
mPaths1.add(mDrawPath);
Log.d(“Ponts值”,mPoints.toString());
}
打破
case MotionEvent.ACTION\u UP:
mDrawPath.lineTo(mX,mY);
add(String.valueOf(touchX));
add(String.valueOf(touchY));
mpath.add(mDrawPath);
mPaints.add(mDrawPaint);
XVALUE=mXPaths.toString().replaceAll(“\\[\124;\\]”,”).replaceAll(“,”,”);
YVALUE=MyPath.toString().replaceAll(“\\[\\]”,简称“).replaceAll(“,”,“,”);
mDrawPath=新路径();
initPaint();
打破
违约:
返回false;
}
使无效();
返回true;
}
公共无效clearCanvas(){
mXPaths.clear();
mypath.clear();
mpath.clear();
mPaints.clear();
mUndonePaths.clear();
mUndonePaints.clear();
XVALUE=“”;
YVALUE=“”;
System.out.println(“Cordinates X:+XVALUE”);
System.out.println(“Cordinates Y:+YVALUE”);
mDrawCanvas.drawColor(0,PorterDuff.Mode.CLEAR);
使无效();
}
公共void setPaintColor(内部颜色){
mPaintColor=颜色;
mDrawPaint.setColor(mPaintColor);
}
公共无效设置PaintStrokeWidth(int strokeWidth){
mStrokeWidth=冲程宽度;
mDrawPaint.setStrokeWidth(msStrokeWidth);
}
公共void setBackgroundColor(内部颜色){
mBackgroundColor=颜色;
mBackgroundPaint.setC
    public class CanvasView_New extends View {
    private Path mDrawPath;
    private Paint mBackgroundPaint;
    private Paint mDrawPaint;
    private Canvas mDrawCanvas;
    private Bitmap mCanvasBitmap, mBitmap;
    public static String XVALUE = "";
    public static String YVALUE = "";
    private static final float TOUCH_TOLERANCE = 5;
    public static ArrayList<String> mXPathsNew = new ArrayList<>();
    public static ArrayList<String> mYPathsNew = new ArrayList<>();
    private ArrayList<String> mUnXPathsNew = new ArrayList<>();
    private ArrayList<String> mUnYPathsNew = new ArrayList<>();
    private ArrayList<Path> mPathsNew = new ArrayList<>();
    private ArrayList<Paint> mPaintsNew = new ArrayList<>();
    private ArrayList<Path> mUndonePathsNew = new ArrayList<>();
    private ArrayList<Paint> mUndonePaintsNew = new ArrayList<>();
    private float mX, mY;

    private int mBackgroundColor = 0xFFFFFFFF;
    private int mPaintColor = 0xFF660000;
    private int mStrokeWidth = 4;
    private ArrayDeque<Point> mPoints1 = new ArrayDeque<>();
    public CanvasView_New(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
        mDrawPath = new Path();
        mBackgroundPaint = new Paint();
        initPaint();
    }

    private void initPaint() {
        mDrawPaint = new Paint();
        mDrawPaint.setColor(mPaintColor);
        mDrawPaint.setAntiAlias(true);
        mDrawPaint.setStrokeWidth(mStrokeWidth);
        mDrawPaint.setStyle(Paint.Style.STROKE);
        mDrawPaint.setStrokeJoin(Paint.Join.ROUND);
        mDrawPaint.setStrokeCap(Paint.Cap.ROUND);
        mDrawPaint.setDither(true);
    }

    private void drawBackground(Canvas canvas) {
        mBackgroundPaint.setColor(mBackgroundColor);
        mBackgroundPaint.setStyle(Paint.Style.FILL);
        canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), mBackgroundPaint);
    }

    private void drawPaths(Canvas canvas) {
        int i = 0;

        for (Path p : mPathsNew) {

            canvas.drawPath(p, mPaintsNew.get(i));
            i++;
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
        Rect source = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        Rect bitmapRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        canvas.drawBitmap(bitmap, source, bitmapRect, new Paint());
        canvas.drawPath(mDrawPath, mDrawPaint);


        for(int i = 0; i< mPoints.size(); i++) {

            mDrawPath.moveTo(mPoints.get(i).x, mPoints.get(i).x);
            mDrawPath.quadTo(mPoints.get(i).x, mPoints.get(i).y, (mPoints.get(i).x +   mPoints.get(i).x) / 2, (mPoints.get(i).y + mPoints.get(i).y) / 2);
            mPathsNew.add(mDrawPath);
            mPaintsNew.add(mDrawPaint);


        }
        drawPaths(canvas);
        canvas.drawPath(mDrawPath, mDrawPaint);

    }

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

        mCanvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        mDrawCanvas = new Canvas(mCanvasBitmap);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDrawPath.moveTo(touchX, touchY);
                mX = touchX;
                mY = touchY;

                break;
            case MotionEvent.ACTION_MOVE:
                float dx = Math.abs(touchX - mX);
                float dy = Math.abs(touchY - mY);
                if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                    mDrawPath.quadTo(mX, mY, (touchX + mX) / 2, (touchY + mY) / 2);
                    mX = touchX;
                    mY = touchY;
                }
                break;
            case MotionEvent.ACTION_UP:

                mDrawPath.lineTo(mX, mY);
                Log.d("Path Values", touchX + " " + touchY);

                mXPathsNew.add(String.valueOf(touchX));
                mYPathsNew.add(String.valueOf(touchY));
                mPathsNew.add(mDrawPath);
                mPaintsNew.add(mDrawPaint);
                Log.d("X Cordinates", mXPathsNew.toString());
                Log.d("Y Cordinates", mYPathsNew.toString());
                 XVALUE = mXPathsNew.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
                 YVALUE = mYPathsNew.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
                System.out.println("Cordinates X: "+XVALUE);
                System.out.println("Cordinates Y:"+YVALUE);

                mDrawPath = new Path();
                initPaint();
                break;
            default:
                return false;
        }

        invalidate();
        return true;
    }

    public void clearCanvas() {
        mXPathsNew.clear();
        mYPathsNew.clear();
        mPathsNew.clear();
        mPaintsNew.clear();
        mUndonePathsNew.clear();
        mUndonePaintsNew.clear();
        XVALUE = "";
        YVALUE = "";
        System.out.println("Cordinates X: "+XVALUE);
        System.out.println("Cordinates Y:"+YVALUE);
        mDrawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
        invalidate();
    }

    public void setPaintColor(int color) {
        mPaintColor = color;
        mDrawPaint.setColor(mPaintColor);
    }

    public void setPaintStrokeWidth(int strokeWidth) {
        mStrokeWidth = strokeWidth;
        mDrawPaint.setStrokeWidth(mStrokeWidth);
    }

    public void setBackgroundColor(int color) {
        mBackgroundColor = color;
        mBackgroundPaint.setColor(mBackgroundColor);
        invalidate();
    }

    public Bitmap getBitmap() {
        drawBackground(mDrawCanvas);
        drawPaths(mDrawCanvas);
        this.setDrawingCacheEnabled(false);
        this.setDrawingCacheEnabled(true);
        return Bitmap.createBitmap(this.getDrawingCache());


    }

    public void undo() {
        if (mPathsNew.size() > 0) {
            mUnXPathsNew.add(mXPathsNew.remove(mPathsNew.size() - 1));
            mUnYPathsNew.add(mYPathsNew.remove(mPathsNew.size() - 1));
            mUndonePathsNew.add(mPathsNew.remove(mPathsNew.size() - 1));
            mUndonePaintsNew.add(mPaintsNew.remove(mPaintsNew.size() - 1));
            Log.d("X Cordinates", mXPathsNew.toString());
            Log.d("Y Cordinates", mYPathsNew.toString());
            XVALUE = mXPathsNew.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
            YVALUE = mYPathsNew.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
            System.out.println("Cordinates X: "+XVALUE);
            System.out.println("Cordinates Y:"+YVALUE);
            invalidate();
        }
    }

    public void redo() {
        if (mUndonePathsNew.size() > 0) {
            mXPathsNew.add(mUnXPathsNew.remove(mUnXPathsNew.size() - 1));
            mYPathsNew.add(mUnYPathsNew.remove(mUnYPathsNew.size() - 1));
            mPathsNew.add(mUndonePathsNew.remove(mUndonePathsNew.size() - 1));
            mPaintsNew.add(mUndonePaintsNew.remove(mUndonePaintsNew.size() - 1));
            Log.d("X Cordinates", mXPathsNew.toString());
            Log.d("Y Cordinates", mYPathsNew.toString());
            XVALUE = mXPathsNew.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
            YVALUE = mYPathsNew.toString().replaceAll("\\[|\\]", "").replaceAll(", ",",");
            System.out.println("Cordinates X: "+XVALUE);
            System.out.println("Cordinates Y:"+YVALUE);
            invalidate();
        }
    }
}