Java 如何在Android Studio中保存我的绘图?
我正在学习android studio和touchevent 首先,我的项目就像油漆 我的密码在这里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
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;
内采场;
公共绘图数据(整型){
这个形状=形状;
}
}
}
将图形保存到何处?你想将其保存为图像文件吗?不,我只是想确保屏幕上有我的痕迹。像这样,真的很感谢,但当我更改颜色时,所有绘制为其颜色的图形现在都更改了。这部分我应该做什么?是的。也可以将颜色作为图形数据中的字段。如果你觉得答案有帮助,你可以接受。干杯