单击按钮时如何保存画布绘图并显示它

Posted

技术标签:

【中文标题】单击按钮时如何保存画布绘图并显示它【英文标题】:How to save canvas drawing and display it when the button is clicked 【发布时间】:2014-11-04 04:25:24 【问题描述】:

嘿,我正在尝试创建 android 应用程序,我可以在底部使用两个按钮在画布上绘图 我设法让绘图工作但是现在我需要添加两个按钮(一个用于将绘图画布保存到数据库(如果可能的话是 Sqlite)或位图,另一个用于从 sqlite 导入图像并将其显示到图形视图)

现在我不知道我必须在其中输入什么代码才能使保存和显示按钮正常工作,所以请帮助我编写代码并感谢您的时间:)

这是我目前的代码(图形绘制工作正常,现在我需要保存和显示按钮的代码,以及我在 graphicsview.java 和 MainActivity.java 中遗漏的代码)

GraphicsView.java

package org.example.graphics;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Path.Direction;
import android.view.*;

public class GraphicsView extends View implements View.OnTouchListener 

public GraphicsView(Context context) 
    super(context);
    setBackgroundColor(Color.WHITE);
    setOnTouchListener(this);


ArrayList<MyPoint> arrOfPoints=new ArrayList<MyPoint>();

class MyPoint

    float x, y;

float downx, downy;

@Override
protected void onDraw(Canvas canvas) 
    // Drawing commands go here

    Paint rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    rectPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    rectPaint.setColor(Color.BLACK);
    canvas.drawRoundRect(new RectF(0, 0, 100, 100), 10, 10, rectPaint);

    rectPaint.setColor(Color.BLUE);
    rectPaint.setAlpha(40);
    canvas.drawCircle(300, 300, 200, rectPaint);
    canvas.drawRect(new RectF(40, 40, 200, 200), rectPaint);
    Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG
            | Paint.STRIKE_THRU_TEXT_FLAG);
    canvas.drawText("Hello there!", 200, 200, textPaint);

    canvas.drawText("You clicked on " + downx + "," + downy, 200, 600,
            textPaint);
        for(int i=0;i<arrOfPoints.size();i++)
                
                    canvas.drawCircle(arrOfPoints.get(i).x, arrOfPoints.get(i).y, 20, rectPaint);
                



@Override
public boolean onTouch(View arg0, MotionEvent arg1) 
    int action = arg1.getAction();
    MyPoint p=null;
    switch (action) 
    case MotionEvent.ACTION_DOWN:
        downx = arg1.getX();
        downy = arg1.getY();

        p=new MyPoint();
        p.x=arg1.getX();p.y=arg1.getY();

        arrOfPoints.add(p);
        invalidate();
        break;
    case MotionEvent.ACTION_MOVE:
        downx = arg1.getX();
        downy = arg1.getY();
        p=new MyPoint();
        p.x=arg1.getX();p.y=arg1.getY();
        arrOfPoints.add(p);
        invalidate();
        break;
    case MotionEvent.ACTION_UP:

        break;
    case MotionEvent.ACTION_CANCEL:
        break;
    default:
        break;
    
    return true;

MainActivity.java

package org.example.graphics;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity 
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(new GraphicsView(this));

ma​​in.xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_
 android:layout_
 android:background="@drawable/background">

 <org.example.graphics.GraphicsView
   android:id="@+id/graphics"
   android:layout_
   android:layout_ />

   <Button
    android:id="@+id/ChoosePictureButton"/>
    android:layout_
    android:layout_
    android:text="Choose Picture"

 <Button
    android:layout_
    android:layout_
    android:text="Save Picture" android:id="@+id/SavePictureButton"/>

</LinearLayout>

我的 AndroidManifest.xml 仍处于默认状态,因为我还没有编辑其中的任何内容

【问题讨论】:

将画布保存为 PNG 文件,然后通过 imageView 加载 在哪里添加 png 文件的代码?在 mainactivity 或 graphicsview 中? 【参考方案1】:

您可以在保存按钮单击侦听器中使用此代码。

int canvasWidth = 500;
int canvasHeight = 500;
View v = new GraphicsView(MainActivity.this);
Bitmap bitmap = Bitmap.createBitmap(canvasWidth, canvasHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
v.draw(canvas);

//now bitmap has your canvas image

//set it to your ImageView
yourImageView.setImageBitmap(bitmap);

//or save to sdcard
File dir = new File("/sdcard/yourAppFolder/");
if (!dir.isDirectory()) 
    dir.mkdirs();

File outputFile = new File(dir, "image.jpg");
OutputStream fout = null;
fout = new FileOutputStream(outputFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
fout.flush();
fout.close();

【讨论】:

所以我必须在 MainActivity.java 中添加保存按钮的方法吗?抱歉,我还是 android 新手,我还没有在 MainActivity.java 中添加任何内容 @KopArtist:是的,你需要在 MainActivity.java 中添加它 非常感谢您的回复,这是我在 MainActivity.java 中的新代码。我很确定这不正确你能告诉我我做错了什么吗? @KopArtist:你需要声明按钮,然后你可以添加点击监听器,查看这个答案***.com/questions/6372104/… 我将 MainActivity.java 中的代码修复为 [tinypic.com/r/2gtn720/8] 这是正确的代码吗?为什么我仍然在“v”上遇到错误

以上是关于单击按钮时如何保存画布绘图并显示它的主要内容,如果未能解决你的问题,请参考以下文章

如何保存我的绘图? (基本绘画应用程序)

如何在点击Vaadin画布上的提交按钮时填写文本?

如何保存我在 tkinter canvas IN sqlite3 数据库中制作的绘图,然后再次在画布上获取它

如何让用户在 WPF 中使用画布绘制线条

来自视频的 HTML5 Canvas drawImage 在第一次绘制时未显示

如何在android中保存绘图画布?