[android] 图片画画板
页面布局,相对布局
按钮位于父窗体的下方使用android:layout_alignParentBottom=”true”
图片位于按钮的上方,填充父窗体,使用android:layout_above=”@+id/xxxxxid”
获取到ImageView对象
调用Bitmap.createBitmap(width,height,config)方法,创建一个可以被修改的Bitmap对象
参数:width height宽高写死,config是Bitmap.Config.ARGB_8888
获取Canvas对象,通过new Canvas(bitmap)
调用Canvas对象的drawColor()方法,初始化背景颜色,参数:Color.WHITE白色
调用ImageView对象的setOnTouchListener()方法,参数:OnTouchListener对象,这个类是一个接口类型,因此直接new它创建匿名内部类实现方法onTouch()
在onTouch(View v,MotionEvent event)方法里面
参数:View对象是被触摸的对象,MotionEvent对象是触摸事件对象
调用MotionEvent对象的getAction()方法,获取触摸事件
switch判断这个事件
事件为MotionEvent.ACTION_DOWN是手指第一次触摸屏幕
事件为MotionEvent.ACTION_MOVE是手指在屏幕上移动
事件为MotionEvent.ACTION_UP是手指离开屏幕
当手指触摸屏幕时
定义手指开始位置的坐标startX startY
调用MotionEvent对象的getX() 和 getY()方法,可以得到坐标
当手指移动的时候,我们要获取新的坐标newX和newY,方法和上面一样
调用Canvas对象的drawLine()方法,画一条线,参数:startX,startY,newX,newY,paint
获取Paint画笔对象,通过new出来
调用Paint对象的setTrokeWidth()方法,设置画笔粗细,参数:像素
调用Paint对象的setColor()方法,设置画笔颜色,参数:Color.GREEN
注意要从新更新画笔的位置
调用ImageView对象的setImageBitmap(bitmap)方法,把Bitmap显示到控件里
onTouch()方法一定要返回true,才能被持续执行
点击保存按钮,把图片保存到SD卡上
调用Bitmap对象的compress()方法,参数:图片格式CompressFormat.JPEG,图片质量100,输出流
获取File对象,通过new File(Environment.getExternalStorageDirectory(),文件名),文件名是时间戳
获取FileOutputStream对象
需要权限android.permission.WRITE_EXTERNAL_STORGE
使用系统图库查看图片
此时会看不到,以为图库只有在sd卡挂载的时候,才扫描文件
获取Intent对象,通过new出来
调用Intent对象的setAction()方法,参数:Intent.ACTION_MEDIA_MOUNTED
调用Intent对象的setData()方法,
参数:文件目录对象Uri.fromFile(Environment.getExternalStorageDirectory())
调用sendBroadcast()方法 发送广播
代码:
package com.tsh.tshpaint; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; 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.InputDevice.MotionRange; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { private ImageView iv_img; private Bitmap baseBitmap; private Canvas canvas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv_img = (ImageView) findViewById(R.id.iv_img); // 创建空Bitmap baseBitmap = Bitmap.createBitmap(320, 359, Bitmap.Config.ARGB_8888); canvas = new Canvas(baseBitmap); canvas.drawColor(Color.WHITE); // 设置手指滑动事件 iv_img.setOnTouchListener(new OnTouchListener() { int startX; int startY; @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); //画笔 Paint paint=new Paint(); paint.setStrokeWidth(5); paint.setColor(Color.GREEN); switch (action) { // 手指按下 case MotionEvent.ACTION_DOWN: startX=(int) event.getX(); startY=(int) event.getY(); break; // 手指移动 case MotionEvent.ACTION_MOVE: int newX=(int) event.getX(); int newY=(int) event.getY(); //划线 canvas.drawLine(startX, startY, newX, newY, paint); startX=(int) event.getX(); startY=(int) event.getY(); iv_img.setImageBitmap(baseBitmap); break; // 手指离开 case MotionEvent.ACTION_UP: break; } return true; } }); } //保存图片 public void save(View v){ File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg"); FileOutputStream stream; try { stream = new FileOutputStream(file); baseBitmap.compress(CompressFormat.JPEG, 100, stream); stream.close(); //发送sd卡挂载通知 Intent intent=new Intent(); intent.setAction(Intent.ACTION_MEDIA_MOUNTED); intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory())); sendBroadcast(intent); Toast.makeText(this, "保存图片成功", 0).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "保存图片失败", 0).show(); } } }
相关文章
- iOS小技能:敏感逻辑的保护方案
- iOS小技能:【intercept the HTTP/HTTPS requests 】利用NSURLProtocol 拦截请求
- iOS小技能:UIWebView 被拒的解决方案(用更安全的WKWebView替代UIWebView)
- iOS小技能:打包注意事项(私有API检测)
- iOS抽奖转盘上篇:概率抽奖算法 & 转盘算法 &轮盘边框动画丨(内含完整Demo)
- Android平台GB28181接入模块技术接入说明
- iOS 离线发表博客的 APP MWeb
- Android平台GB28181设备接入模块分辨率发生变化怎么办?
- Android Camera2 Focus Distance
- 小程序化正在成为大势所趋?
- 小程序化正在成为线上教育服务的最佳方式
- 技术干货|如何借助FinClip实现小程序在硬件设备上的运行
- Jitpack发布Android库出现Direct local .aar file dependencies are not supported when building an AAR
- 关于Android12安装apk出现-108异常INSTALL_PARSE_FAILED_MANIFEST_MALFORMED的解决方法
- Android 多module情况下module依赖aar问题处理
- Android7.0以上的分享图片文件错误及解决方法
- Android开发 对接微信分享SDK总结
- Android RecyclerView使用ListAdapter高效刷新数据
- Android自动化测试工具调研
- Android 自动取色并设置沉浸式状态栏