Android实现画画板案例
作者:常利兵 发布时间:2023-01-11 08:35:28
标签:Android,画板
本文实例为大家分享了Android实现画画板的具体代码,供大家参考,具体内容如下
① 准备一个布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.it.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:text="修改颜色"
android:onClick="color"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text="粗细+1"
android:onClick="size"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text="保存图片"
android:onClick="save"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView
android:id="@+id/iv_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
② 核心代码
package com.example.it;
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.Environment;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
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 AppCompatActivity {
private final String TAG = getClass().getSimpleName();
private ImageView iv_show;
private Bitmap copyBm;
private float x;
private float y;
private Paint paint;
private int paintsize = 1;
private FileOutputStream fos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
iv_show = (ImageView) findViewById(R.id.iv_bg);
//创建一个空白的bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
copyBm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
//创建画布
final Canvas canvas = new Canvas(copyBm);
//使用画布绘制图片
paint = new Paint();
canvas.drawBitmap(bitmap,new Matrix(), paint);
iv_show.setImageBitmap(copyBm);
//为画笔在屏幕上移动设置监听事件
iv_show.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//获取当前事件的类型
int action = event.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
//如果是手指按下时,记录一下手指的位置
x = event.getX();
y = event.getY();
Log.e(TAG,x+"******"+y);
break;
case MotionEvent.ACTION_MOVE:
//如果手指正在移动时
float x1 = event.getX();
float y1 = event.getY();
canvas.drawLine(x,y,x1,y1, paint);
x = x1;
y = y1;
Log.e(TAG,x1+"**********"+y1);
break;
case MotionEvent.ACTION_UP:
break;
}
iv_show.setImageBitmap(copyBm);
return true;
}
});
}
//修改颜色
public void color(View view) {
paint.setColor(Color.RED);
}
//修改线条粗细
public void size(View view) {
paintsize+=1;
paint.setStrokeWidth(paintsize);
}
//保存图片
public void save(View view) {
//设置图片保存的位置
File file = new File(Environment.getExternalStorageDirectory(), SystemClock.currentThreadTimeMillis()+".png");
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//设置参数保存的质量
copyBm.compress(Bitmap.CompressFormat.PNG,100,fos);
//定义一个意图,通过发出广播告诉系统扫描指定的位置的文件
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
sendBroadcast(intent);
}
}
③ 权限信息
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
来源:https://blog.csdn.net/qq_32890771/article/details/71566165


猜你喜欢
- 解决方法有如下两种:第一种如果你 repo sync 了 android 的整个源码,那么可以直接把你的 app 放到 /packages/
- 一、安装本地Maven选择你需要的maven版本下载:官网下载传送门我使用的是3.6.1版本:maven-3.6.1-bin.zip&nbs
- 本文实例讲述了Java使用TCP套接字实现多人聊天功能。分享给大家供大家参考,具体如下:废话不多说,直接开搞:先创建一个服务端:packag
- 序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程。对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过
- C++类返回值是*this成员函数当C++类的成员函数其返回值是*this时,表示返回值是调用该成员函数的变量的引用。例如:class A{
- 帮我们实现各种类型的复杂手势操作。其实例通过静态工厂创建ViewDragHelper一般用在一个自定义ViewGroup的内部。初始化操作
- SpringMVC接收到请求和数据后,进行一些了的处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎
- 在Java 5以前,是用synchronized关键字来实现锁的功能。synchronized关键字可以作为方法的修饰符(同步方法),也可作
- 本文实例为大家分享了Java实现学生管理系统的具体代码,供大家参考,具体内容如下1.学生管理系统(控制台界面实现)//学生类,继承Seria
- 本文实例总结了C#中split用法。分享给大家供大家参考,具体如下:以下是我转载的两个不同的人的,方便大家及自己查阅string s=&qu
- 一、需求来源app需要支持实现游客模式,启动后直接进入首页菜单,但是进入二级页则自动调用登录页面。总结需求就是父视图拦截子视图的响应事件,思
- 通过邮件找回密码功能的实现1、最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是
- 线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,
- 一、概述一个Process组件提供了在计算机运行进程的访问权限。 进程,在最简单的术语中,是正在运行的应用。提供对本地和远程进程的访问权限并
- 在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用
- IntelliJ IDEA2022 springboot 热部署 html#pom.xml<dependency>
- 概况本文主要给大家介绍了通过JDK源码学习InputStream的相关内容,JDK 给我们提供了很多实用的输入流 xxxInputStrea
- 开发环境:android4.1.1实验功能:在第一个Hello World!为标签的activity中显示good,该界面中有一个名为Nex
- 简介设计模式是软件设计中的一种常见方法,通过定义一系列通用的解决方案,来解决常见的软件设计问题。其中,抽象工厂模式是一种非常常见的设计模式,
- 1 问题手写一个程序,完成List集合对象的逆序遍历2 方法创建List接口的多态对象向创建好list集合添加元素使用hasPrevious