帮一个小孩解决图片涂鸦的问题,问题解决完了,来记录一下,以后用的时候直接Copy

  1. 定义个view继承ImageView

    package com.example.help;import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.PaintFlagsDrawFilter;
    import android.graphics.Path;
    import android.graphics.PorterDuff;
    import android.util.AttributeSet;
    import android.view.MotionEvent;import androidx.appcompat.widget.AppCompatImageView;public class MyImageview extends AppCompatImageView {private Path mPath;//绘制路径private Paint mPaint;// 绘制画笔private Canvas mCanvas;//背景画布private Bitmap mMBitmap;//背景bitmappublic MyImageview(Context context) {this(context, null);}public MyImageview(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyImageview(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initPaint();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);mMBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);mCanvas = new Canvas(mMBitmap);mCanvas.drawColor(Color.TRANSPARENT);mCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));}private void initPaint() {mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(Color.BLACK);mPaint.setStrokeWidth(10.0f);mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeJoin(Paint.Join.ROUND);mPaint.setDither(true);mPath = new Path();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));canvas.drawBitmap(mMBitmap, 0, 0, mPaint);// 通过画布绘制多点形成的图形canvas.drawPath(mPath, mPaint);}private float[] downPoint = new float[2];private float[] previousPoint = new float[2];@Overridepublic boolean onTouchEvent(MotionEvent event) {downPoint[0] = event.getX();downPoint[1] = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:previousPoint[0] = downPoint[0];previousPoint[1] = downPoint[1];mPath.moveTo(downPoint[0], downPoint[1]);break;case MotionEvent.ACTION_MOVE:float dX = Math.abs(downPoint[0] - previousPoint[0]);float dY = Math.abs(downPoint[1] - previousPoint[1]);// 两点之间的距离大于等于3时,生成贝塞尔绘制曲线if (dX >= 3 || dY >= 3) {// 设置贝塞尔曲线的操作点为起点和终点的一半float cX = (downPoint[0] + previousPoint[0]) / 2;float cY = (downPoint[1] + previousPoint[1]) / 2;// 二次贝塞尔,实现平滑曲线;previousX, previousY为操作点,cX, cY为终点mPath.quadTo(previousPoint[0], previousPoint[1], cX, cY);// 第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值previousPoint[0] = downPoint[0];previousPoint[1] = downPoint[1];}break;case MotionEvent.ACTION_UP:mCanvas.drawPath(mPath, mPaint);mPath.reset();break;}invalidate();return true;}public void clear() {if (mCanvas != null) {mPath.reset();mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);invalidate();}}}
  2. 引用
        /*** 主要方法:创建一个bitmap放于画布之上进行绘制*/private static Bitmap convertViewToBitmap(View tempView) {Bitmap bitmap = Bitmap.createBitmap(tempView.getWidth(),tempView.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);tempView.draw(canvas);return bitmap;}

    友情提示:设置图片可以用glide,convertViewToBitmap方法拿到bitmap后自行处理(保存到本地或者上传啥的)


今天无聊,更新一下这个,加上保存到本地,在保存之前要动态申请读写权限(针对6.0以上),直接上代码了

package com.example.help2;import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;public class MainActivity extends AppCompatActivity {private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE};int[] res = new int[]{R.drawable.icon_address, R.drawable.icon_shoucang, R.drawable.icon_weishoucang};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final MyImageview imageview = findViewById(R.id.image);imageview.setImageResource(R.drawable.icon_address);final ImageView imageView2 = findViewById(R.id.image2);checkPermission();findViewById(R.id.commit).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Bitmap bitmap = convertViewToBitmap(imageview);imageView2.setImageBitmap(bitmap);saveImageToGallery(bitmap);imageview.clear();imageview.setImageResource(res[new Random().nextInt(2)]);}});}/*** 主要方法:创建一个bitmap放于画布之上进行绘制*/private static Bitmap convertViewToBitmap(View tempView) {Bitmap bitmap = Bitmap.createBitmap(tempView.getWidth(),tempView.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);tempView.draw(canvas);return bitmap;}/*** 保存图片到本地* @param bmp* @return*/public int saveImageToGallery(Bitmap bmp) {//生成路径String root = Environment.getExternalStorageDirectory().getAbsolutePath();String dirName = "dou";File appDir = new File(root , dirName);if (!appDir.exists()) {appDir.mkdirs();}//文件名为时间long timeStamp = System.currentTimeMillis();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String sd = sdf.format(new Date(timeStamp));String fileName = sd + ".jpg";//获取文件File file = new File(appDir, fileName);FileOutputStream fos = null;try {fos = new FileOutputStream(file);bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);fos.flush();//通知系统相册刷新MainActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.fromFile(new File(file.getPath()))));return 2;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (fos != null) {fos.close();}} catch (IOException e) {e.printStackTrace();}}return -1;}/*** 检查权限*/public void checkPermission() {if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, 100);}}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 1) {for (int i = 0; i < permissions.length; i++) {Log.d("MainActivity", "申请的权限为:" + permissions[i] + ",申请结果:" + grantResults[i]);}}}
}

在图片上涂鸦(其实就是乱画 O(∩_∩)O)相关推荐

  1. 前端 HTML5 Svg 画板(支持视频、图片上涂鸦,支持缩放、修改、颜色、复选...)

    GitHub 地址 支持 视频.图片 上涂鸦,做标记 画板功能支持 矩形.圆形.椭圆.箭头.直线.文本,支持 缩放.修改.调整字号颜色.移动位置....,画板数据支持上传保存,后续传入重新复原. 画板 ...

  2. Android作业:设计一个能在图片上涂鸦的程序

    一.内容 设计一个能在图片上涂鸦的程序 二.实现 activity_main.xml MainActivity.java HandWrite.java

  3. 能在图片上涂鸦的软件有哪些?分享几种好用涂鸦工具

    涂鸦可以增加趣味性.在照片上涂鸦可以增加趣味性,让照片更加有趣.无论是在旅行照片中添加一些有趣的涂鸦,还是在生活照片中添加一些幽默的涂鸦,都可以让照片更具有趣味性.很多小伙伴不清楚怎么在照片上进行涂鸦 ...

  4. 图片上加动图怎么弄_用PS把千张图片拼成心爱的人的样子,只需三步!

    把千张图片拼成一张图像也就是千图成像,用PS还是很简单的,虽然说我还在存够心爱的人的千张图片的路上,但是这个技巧可以先学上. 教程开始 步骤一:准备好图片,如果图片尺寸不统一,可以用PS的这个自动批量 ...

  5. 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能...

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.(抄的...) UEditor是非常好用的富文 ...

  6. UEditor之基于Java图片上传前后端源码研究

    那么开始吧! 这是我的项目目录 1.从访问路径http://localhost:8081/Test/_examples/simpleDemo.html,我们主要是要看看,富文本框被加载出来之前,会调用 ...

  7. 从图片到涂鸦:高品质涂鸦的自动生成

    Photo-Sketching: Inferring Contour Drawings from Images 从图片到涂鸦:高品质涂鸦的自动生成 项目地址:从图片到涂鸦:高品质涂鸦的自动生成 论文: ...

  8. android 图片字体涂鸦,美字自定义涂鸦图形

    美字自定义涂鸦图形app是一款非常强大的字体美化软件.美字自定义涂鸦图形软件使用非常简单,自定义书写美字自定义涂鸦图形涂鸦文字之后就能设置字体大小,美化你的字体! 软件介绍 美字自定义涂鸦图形app是 ...

  9. 详细阐述Web开发中的图片上传问题

    Web开发中,图片上传是一种极其常见的功能.但是呢,每次做上传,都花费了不少时间. 一个"小功能"花费我这么多时间,真心不愉快. So,要得认真分析下原因. 1.在最初学习Java ...

最新文章

  1. python基础常用语句-Python基础语法
  2. 陕师大计算机专业,陕师大计算机系组合数学试题
  3. 办公效率:从事会计行业,这些Excel技巧绝对用得着!
  4. 自己写的几个常用到的函数
  5. CEF3:https 请求返回状态码canceled
  6. 网络管理员在预先分配和识别作为_网络管理员必备流量分析工具,果断转发收藏!...
  7. 计算机网络复习-网络层
  8. php调用winhttp,HTTP HTTPS POST GET(包含curl版本和winhttp两种实现)
  9. 信息熵及其Python的实现
  10. Java输出竖排古典文字
  11. emoji粉色爱心符号_粉色爱心符号
  12. 大数据给交通行业带来的五大变革
  13. POI 复制 word 表中的行操作 以及样式
  14. 计算机单片机实训报告,单片机实训总结
  15. 【大数据开发】Python基础——Python序列
  16. 面试官:线上服务CPU飙高怎么排查?
  17. python图像代码怎么变成图像_如何让一张图片变成二值图像?python+opencv图像处理...
  18. 索尼WH-1000XM4 win11PC下声音音质差的解决方案
  19. 科大奥瑞物理实验——光电效应和普朗克常量的测定
  20. java文件预览和文件下载响应设置

热门文章

  1. Unity Android手机触屏事件
  2. CentOS6.5挂载U盘
  3. 帝国时代2决定版多人游戏服务器维护,帝国时代2决定版怎么在多人模式中玩战役 多人战役方法一览_游侠网...
  4. 3款强大到离谱的电脑软件,个个提效神器,从此远离加班
  5. Python len() 函数
  6. 计算机c盘空间被虚拟占满,C盘空间总是莫名其妙的满了,又不想重装系统,5招教你如何瘦身...
  7. p0f - 被动探测操作系统工具
  8. 浅谈面试中常提到的乐观锁与悲观锁
  9. Anki 学习排行榜
  10. 淘宝店铺动销率对店铺有什么影响,怎样提高店铺动销率