1.常规操作,创建项目

2.清单文件给权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.canvas"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Map"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

3.布局文件

<LinearLayout 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"android:orientation="vertical"android:paddingLeft="5dp"android:paddingTop="5dp"android:paddingRight="5dp"android:paddingBottom="5dp"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_resume"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="重新画图" /><Buttonandroid:id="@+id/btn_save"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="保存图片" /></LinearLayout><ImageViewandroid:id="@+id/iv_canvas"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

4.主活动

package com.example.canvas;import androidx.appcompat.app.AppCompatActivity;import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
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.Button;
import android.widget.ImageView;
import android.widget.Toast;import java.io.File;
import java.io.FileOutputStream;public class MainActivity extends AppCompatActivity {private Button btn_save,btn_resume;private ImageView iv_canvas;private Bitmap baseBitmap;private Canvas canvas;private Paint paint;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化画笔paint = new Paint();paint.setStrokeWidth(5);paint.setColor(Color.RED);iv_canvas = findViewById(R.id.iv_canvas);btn_save = findViewById(R.id.btn_save);btn_resume = findViewById(R.id.btn_resume);btn_save.setOnClickListener(click);btn_resume.setOnClickListener(click);iv_canvas.setOnTouchListener(touch);//屏幕触摸事件监听器}private View.OnClickListener click = new View.OnClickListener(){@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn_save:saveBitmap();break;case R.id.btn_resume:resumeCanvas();break;default:break;}}};private View.OnTouchListener touch = new View.OnTouchListener() {//定义手指开始触屏的坐标float startX;float startY;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()){case MotionEvent.ACTION_DOWN:if(baseBitmap==null){baseBitmap = Bitmap.createBitmap(iv_canvas.getWidth(),iv_canvas.getHeight(),Bitmap.Config.ARGB_8888);canvas = new Canvas(baseBitmap);canvas.drawColor(Color.WHITE);}startX = event.getX();startY = event.getY();break;//手指在屏幕上移动的动作case MotionEvent.ACTION_MOVE://记录移动位置上移动的动作float stopX = event.getX();float stopY = event.getY();//根据两点坐标,绘制连线canvas.drawLine(startX,startY,stopX,stopY,paint);//更新开始点的位置startX = event.getX();startY = event.getY();//把图片展示到ImageView中iv_canvas.setImageBitmap(baseBitmap);break;case MotionEvent.ACTION_UP:break;default:break;}return true;}};//保存到SD卡protected  void saveBitmap(){try{File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis() + ".png");FileOutputStream stream = new FileOutputStream(file);baseBitmap.compress(Bitmap.CompressFormat.PNG,100,stream);Toast.makeText(MainActivity.this, "保存图片成功", Toast.LENGTH_SHORT).show();Intent intent = new Intent();intent.setAction(Intent.ACTION_MEDIA_MOUNTED);intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));sendBroadcast(intent);}catch (Exception e){Toast.makeText(MainActivity.this, "保存图片失败", Toast.LENGTH_SHORT).show();e.printStackTrace();}}protected void resumeCanvas(){if(baseBitmap != null){baseBitmap = Bitmap.createBitmap(iv_canvas.getWidth(),iv_canvas.getHeight(),Bitmap.Config.ARGB_8888);canvas = new Canvas(baseBitmap);canvas.drawColor(Color.WHITE);iv_canvas.setImageBitmap(baseBitmap);Toast.makeText(MainActivity.this, "清除画板成功 重新绘画", Toast.LENGTH_SHORT).show();}}
}

5.运行,记得在虚拟机给应用权限

6.可以使用你自己的应用了

【Android】用Android写个自己的画板APP相关推荐

  1. Android Studio 实现的画板App

    基于Android Studio 实现的画板App ** 1.实现目标** 随着科技的不断发展和社会的不断进步,手机越来越流行,成为了人们日常生活和学习的必要工具,人们越来越离不开手机,还在几年前手机 ...

  2. Android 电子签名/手写签名 保存到相册详解

    ps:因公司推崇线上信息办公化 设计到客户签名 将客户签好的名字上传到服务器 因此 写了一个demo 废话不多哔哔 上效果图: 这里我运用的是自定义view //权限<uses-permissi ...

  3. Android实现的写字板(绘画板)

    Android实现的写字板(绘画板) 前言: 通过Android实现绘画板的功能,能够在应用中进行绘画(写字)操作,完成绘画(写字)后,可以将我们自己绘制的图画(字体)进行保存,同时也能清空画板上的内 ...

  4. Wiew 像写 Android UI 一样写小游戏布局

    Wiew 项目地址: https://github.com/onlynight/Wiew 简易微信小游戏view系统以及touch系统.你可以想写Android UI一样写界面布局,处理点击事件. 预 ...

  5. 将tensorflow训练好的模型移植到Android (MNIST手写数字识别)

    将tensorflow训练好的模型移植到Android (MNIST手写数字识别) [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/det ...

  6. android上如何写配置文件

    android上如何写配置文件:使用SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态 ...

  7. android xposed如何写,安卓Hook系列教程(一):xposed模块开发环境搭建

    posed教程比较多,但是大多都相差无几,要么就只是入门级,要么就是从源码角度分析xposed的原理.但是针对xposed开发技巧类的却不多,很难找. 经常有人问我xposed静态方法,静态变量如何h ...

  8. Android Studio学写英语听写APP(音乐播放器)一

    最近迷上了AndroidAPP,看了点资料就边学边写,只是打发时间的个人爱好,工具为Android Studio3.0.1,为了偷懒,准备给孩子写个听写APP,思路是到时候从APP下载音频资源包到SD ...

  9. android 电子签名 手写签名 功能实现

    android 电子签名  手写签名 功能实现 这个手写的效果 就是一个 重写的的自定义的view  代码如下: package com.example.hand.views;import java. ...

最新文章

  1. python3 2.00gb怎么去掉单位_最值得期待的Python 3.9的新功能
  2. android老 电池,为什么安卓手机不会因为电池的老化而降频呢?
  3. Myeclipse5.5获取注册码
  4. HDU-2159-FATE(dp)
  5. QLoo graphql engine 学习二 基本试用(kubernetes)
  6. 如何提升企业的数据挖掘能力
  7. C++基础:第五章 表达式基础与详述
  8. Linux中EXPORT_SYMBOL的用法
  9. 蓝桥杯和noip都考C语言么,为什么NOIP信息学奥赛C++普及组师资匮乏
  10. MATLAB求函数零点—fzero函数
  11. 计算机常用英语术语词汇表
  12. java jconsole 远程连接_jconsole连接远程tomcat
  13. 2018-DeepLabV3+论文解读
  14. 异步时间扭曲(Asynchronous Timewarp简称ATW)一种生成中间帧技术
  15. 程序输出我是java小公主,我的同学英文
  16. hive执行出现问题:Ended Job = job_1667594872527_3123 with errors Error during job, obtaining debugging info
  17. java的if 、if else、while、do while、switch、for执行语句
  18. OpenCV 微信QRCode二维码
  19. 云原生 - 负载均衡(SLB)多可用区
  20. Ubuntu18.04安装详细教程

热门文章

  1. 中南大学计算机学院竞赛,计算机学院成功举办第十届“三十佳”教学竞赛选拔赛...
  2. HAUT 1261地狱飞龙 自适应辛普森 数值积分
  3. 视频怎么转换成GIF?学会这招就能制作表情包了
  4. Ae:表达式语言基础
  5. 计算机软件水平考试哪个好考,2020年计算机软考高级哪个好考
  6. 基于asp.net班费管理系统的设计与实现#毕业设计#课程设计
  7. 玩转canvas之实现一个圆角矩形
  8. 微信朋友圈在服务器多久刷新,官方回复微信朋友圈不能刷新为什么微信朋友圈不能刷新...
  9. python入门教程(非常详细),python教学资源百度网盘
  10. linux ctex缺少字体,解决ctex包在linux下找不到一些中文字体的问题