Android实现简单画图画板
作者:yu-Knight 发布时间:2022-04-02 12:52:56
标签:Android,画图,画板
本文实例为大家分享了Android实现简单画图画板的具体代码,供大家参考,具体内容如下
效果如图:
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/iv"
android:layout_width="600px"
android:layout_height="900px"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="red"
android:text="红色" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="green"
android:text="绿色"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="brush"
android:text="刷子"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="eraser"
android:text="橡皮擦"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="save"
android:text="保存" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="cancel"
android:text="取消" />
</LinearLayout>
</RelativeLayout>
MainActivity.java
package com.example.yulongji.android10;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class MainActivity extends Activity {
private ImageView iv;
//原图
private Bitmap bitsrc;
//拷贝图
private Bitmap bitcopy;
private Canvas canvas;
private Paint paint;
private int startX;
private int startY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
setBitmap();
// 设置触摸侦听
iv.setOnTouchListener(new View.OnTouchListener() {
// 触摸屏幕时,触摸事件产生时,此方法调用
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
// 用户手指摸到屏幕
case MotionEvent.ACTION_DOWN:
startX = (int) event.getX();
startY = (int) event.getY();
break;
// 用户手指正在滑动
case MotionEvent.ACTION_MOVE:
int x = (int) event.getX();
int y = (int) event.getY();
canvas.drawLine(startX, startY, x, y, paint);
// 每次绘制完毕之后,本次绘制的结束坐标变成下一次绘制的初始坐标
startX = x;
startY = y;
iv.setImageBitmap(bitcopy);
break;
// 用户手指离开屏幕
case MotionEvent.ACTION_UP:
break;
}
// true:告诉系统,这个触摸事件由我来处理
// false:告诉系统,这个触摸事件我不处理,这时系统会把触摸事件传递给imageview的父节点
return true;
}
});
}
public void setBitmap() {
// 加载画画板的背景图
bitsrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
// 创建图片副本
// 1.在内存中创建一个与原图一模一样大小的bitmap对象,创建与原图大小一致的白纸
bitcopy = Bitmap.createBitmap(bitsrc.getWidth(), bitsrc.getHeight(),
bitsrc.getConfig());
// 2.创建画笔对象
paint = new Paint();
// 3.创建画板对象,把白纸铺在画板上
canvas = new Canvas(bitcopy);
// 4.开始作画,把原图的内容绘制在白纸上
canvas.drawBitmap(bitsrc, new Matrix(), paint);
// 5.将绘制的图放入imageview中
iv.setImageBitmap(bitcopy);
}
public void red(View view){
paint.setColor(Color.RED);
}
public void green(View view){
paint.setColor(Color.GREEN);
}
public void brush(View view){
paint.setStrokeWidth(8);
}
public void cancel(View view){
setBitmap();
}
public void eraser(View view){
paint.setColor(Color.rgb(243,243,243));
paint.setStrokeWidth(30);
}
public void save(View view){
String path = Environment.getExternalStorageDirectory() + "/" + "2.png";
File file = new File(path);
try {
FileOutputStream fos = new FileOutputStream(file);
bitcopy.compress(Bitmap.CompressFormat.PNG, 100, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 发送sd卡就绪广播
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
}
}
来源:https://blog.csdn.net/u014657752/article/details/47983061


猜你喜欢
- StringUtils.isBlank()的使用在校验一个String类型的变量是否为空时,可以使用StringUtils.isBlank方
- 在使用EF查询数据的时候,我们常用的查询数据方式有linq to sql,linq to object,查询返回的结果有两种类型:IQuer
- 说明Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。Spring Security是一个专注于为Java应
- 这篇文章主要介绍了如何使用SpEL表达式实现动态分表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- namespace ConsoleApplication1{ using System; &n
- Mutex类、Event类、SemaphoreSlim类和ReaderWriterLockSlim类等提供了多个进程之间的线程同步。&nbs
- Flutter页面在软键盘弹出的时候,可以设置 Scaffold 的 resizeToAvoidBottomInset 属性来设置
- 图像滤波在opencv中可以有多种实现形式自定义滤波如使用3×3的掩模:对图像进行处理.使用函数filter2D()实现#include&l
- 一,Maven 依赖 pom.xml配置1, 去掉默认日志,以便切换到log4j2的日志依赖2, 然后添加如下两个日志依赖二,在工程根目录下
- 本文实例讲述了Android ActionBar Item用法。分享给大家供大家参考,具体如下:这里主要讲述ActionBar Item的使
- 欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demo
- fatal error C1003: error count exceeds number; stopping compilation中文对
- 本文实例为大家分享了java二维码的实现代码,供大家参考,具体内容如下这次用到的jar包是zxing,没有用到core的jar包先导入zxi
- Failed to execute goal org.apache.maven.plugins:maven-resources-plugin
- Android上杀掉进程的方式有两种,分别是System.exit(0)和Process.killProcess(Process.myPid
- 背景我们经常在网上下载一些视频教程,然而这些视频命名规则各不相同,即使对于相同类型的文件名来说,当文件数量很大且文件名全部是中文时,文件排序
- 这篇文章主要介绍了java的package和import机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 一、select是什么select——>用于选择更快的结果。基于场景理解比如客户端要查询一个商
- 绑定(Binding)元素介绍首先,盗用张图。这图形象的说明了Binding的机理。此处主要介绍的绑定类是System.Windows.Da
- 目录概述非阻塞算法依赖JCTools队列队列实现原子队列容量其他数据结构工具性能测试使用JCTools的缺点结论概述在本文中,我们将介绍JC