Java 如何在Android Studio中保存我的绘图?

Java 如何在Android Studio中保存我的绘图?,java,android,arraylist,Java,Android,Arraylist,我正在学习android studio和touchevent 首先,我的项目就像油漆 我的密码在这里 package com.example.a2_touchevent; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.gra

我正在学习android studio和touchevent

首先,我的项目就像油漆

我的密码在这里

package com.example.a2_touchevent;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SubMenu;
import android.view.View;

import static android.graphics.drawable.GradientDrawable.LINE;
import static android.graphics.drawable.GradientDrawable.RECTANGLE;

public class MainActivity extends AppCompatActivity {

final static int LINE = 1, CIRCLE = 2, RECTANGLE = 3;
static int curShape = LINE;
static int color = Color.BLACK;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new MyGraphicView(this));
}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    super.onCreateOptionsMenu(menu);
    menu.add(0, 1, 0, "선 그리기"); //draw Line
    menu.add(0, 2, 0, "원 그리기"); //draw Circle
    menu.add(0, 3, 0, "사각형 그리기"); //draw Rectangle

    SubMenu subMenu = menu.addSubMenu("색상 변경 >> "); //Colorchange
    subMenu.add(0, 4, 0, "빨강"); //red
    subMenu.add(0, 5, 0, "초록"); //green
    subMenu.add(0, 6, 0, "파랑"); //blue

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()){
        case 1:
            curShape = LINE;
            return true;
        case 2:
            curShape = CIRCLE;
            return true;
        case 3:
            curShape = RECTANGLE;
            return true;
        case 4:
            color = Color.RED;
            return true;
        case 5:
            color = Color.GREEN;
            return true;
        case 6:
            color = Color.BLUE;
            return true;

    }
    return super.onOptionsItemSelected(item);
}

private static class MyGraphicView extends View {
    int startX = -1, startY = -1, stopX = -1, stopY = -1;
    public MyGraphicView(Context context){
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                startX = (int) event.getX();
                startY = (int) event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                stopX = (int) event.getX();
                stopY = (int) event.getY();
                this.invalidate();
                break;
        }
        return true;
    }

    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(color);

        switch (curShape) {
            case LINE:

                canvas.drawLine(startX, startY, stopX, stopY, paint);
                break;
            case CIRCLE:
                int radius = (int) Math.sqrt(Math.pow(stopX - startX, 2) + Math.pow(stopY - startY, 2));
                canvas.drawCircle(startX, startY, radius, paint);
                break;
            case RECTANGLE:
                Rect rect = new Rect(startX, startY, stopX, stopY);
                canvas.drawRect(rect, paint);
                break;
        }
    }
}
}

结果就在这里

p、 s如何发布有问题的GIF文件

无论如何,我想在新鼠标单击事件之前保存我的绘图。 我课本上的提示是,使用动态列表,但我不能使用它

首先,我创建myShape类

private static class MyShape {
    int shapeType;
    int startX, startY, stopX, stopY;
    int color;

    static List<MyShape> myshape = new ArrayList<MyShape>();
}
私有静态类MyShape{
int字形;
int startX、startY、stopX、stopY;
内色;
静态列表myshape=newarraylist();
}
然后,我如何使用这个类并保存我的图形


谢谢。

您可以维护drawingData(绘制形状所需的数据)列表,并且在onDraw函数中,您可以循环使用这些数据并进行绘制。MyGraphicView的示例实现可能与下面的类似

private static class MyGraphicView extends View {
        DrawingData currentShape = null;
        ArrayList<DrawingData> drawingData = new ArrayList<>();

        public MyGraphicView(Context context) {
            super(context);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    currentShape = new DrawingData(curShape);
                    currentShape.startX = (int) event.getX();
                    currentShape.startY = (int) event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    currentShape.stopX = (int) event.getX();
                    currentShape.stopY = (int) event.getY();
                    this.invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    currentShape.stopX = (int) event.getX();
                    currentShape.stopY = (int) event.getY();

                    drawingData.add(currentShape);
                    currentShape = null;
                    this.invalidate();
                    break;
            }
            return true;
        }

        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStrokeWidth(5);
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(color);

            for (DrawingData drawingDatum : drawingData) {
                drawShape(drawingDatum, canvas, paint);
            }

            if (currentShape != null) {
                drawShape(currentShape, canvas, paint);
            }

        }

        private void drawShape(DrawingData drawingDatum, Canvas canvas, Paint paint) {
            switch (drawingDatum.shape) {
                case LINE:

                    canvas.drawLine(drawingDatum.startX, drawingDatum.startY, drawingDatum.stopX, drawingDatum.stopY, paint);
                    break;
                case CIRCLE:
                    int radius = (int) Math.sqrt(Math.pow(drawingDatum.stopX - drawingDatum.startX, 2) + Math.pow(drawingDatum.stopY - drawingDatum.startY, 2));
                    canvas.drawCircle(drawingDatum.startX, drawingDatum.startY, radius, paint);
                    break;
                case RECTANGLE:
                    Rect rect = new Rect(drawingDatum.startX, drawingDatum.startY, drawingDatum.stopX, drawingDatum.stopY);
                    canvas.drawRect(rect, paint);
                    break;
            }
        }

        private static class DrawingData {

            int shape;
            int startX;
            int startY;
            int stopX;
            int stopY;

            public DrawingData(int shape) {
                this.shape = shape;
            }

        }

    }
私有静态类MyGraphicView扩展视图{
DrawingData currentShape=null;
ArrayList drawingData=新建ArrayList();
公共MyGraphicView(上下文){
超级(上下文);
}
@凌驾
公共布尔onTouchEvent(运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
currentShape=新的绘图数据(curShape);
currentShape.startX=(int)event.getX();
currentShape.startY=(int)event.getY();
打破
case MotionEvent.ACTION\u移动:
currentShape.stopX=(int)event.getX();
currentShape.stopY=(int)event.getY();
这个。使无效();
打破
case MotionEvent.ACTION\u UP:
currentShape.stopX=(int)event.getX();
currentShape.stopY=(int)event.getY();
drawingData.add(currentShape);
currentShape=null;
这个。使无效();
打破
}
返回true;
}
受保护的void onDraw(画布){
super.onDraw(帆布);
油漆=新油漆();
paint.setAntiAlias(真);
油漆。设置行程宽度(5);
绘制.设置样式(绘制.样式.笔划);
油漆。设置颜色(颜色);
用于(DrawingData drawingDatum:DrawingData){
drawShape(drawingDatum、canvas、paint);
}
如果(currentShape!=null){
drawShape(当前形状、画布、油漆);
}
}
私有void drawShape(DrawingData drawingDatum、画布、油漆){
开关(drawingDatum.shape){
案例行:
画布.拉线(drawingDatum.startX,drawingDatum.startY,drawingDatum.stopX,drawingDatum.stopY,油漆);
打破
案例圈:
int半径=(int)Math.sqrt(Math.pow(drawingdatam.stopX-drawingdatam.startX,2)+Math.pow(drawingdatam.stopY-drawingdatam.startY,2));
canvas.drawCircle(drawingDatum.startX、drawingDatum.startY、半径、油漆);
打破
大小写矩形:
Rect Rect=新Rect(drawingDatum.startX、drawingDatum.startY、drawingDatum.stopX、drawingDatum.stopY);
画布.drawRect(rect,paint);
打破
}
}
私有静态类DrawingData{
内部形状;
int startX;
int startY;
int stopX;
内采场;
公共绘图数据(整型){
这个形状=形状;
}
}
}

将图形保存到何处?你想将其保存为图像文件吗?不,我只是想确保屏幕上有我的痕迹。像这样,真的很感谢,但当我更改颜色时,所有绘制为其颜色的图形现在都更改了。这部分我应该做什么?是的。也可以将颜色作为图形数据中的字段。如果你觉得答案有帮助,你可以接受。干杯