画画 保存为图片 MaskFilter 边缘效果
使用
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />public class MainActivity extends Activity {float blurRadius = 5f;//在使用光之前的模糊不清的面具的宽度。private DrawView drawView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);drawView = new DrawView(this);setContentView(drawView);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {new MenuInflater(this).inflate(R.menu.main, menu);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.red:drawView.getPaint().setColor(Color.RED);break;case R.id.blue:drawView.getPaint().setColor(Color.BLUE);break;case R.id.green:drawView.getPaint().setColor(Color.GREEN);break;case R.id.width_3:drawView.getPaint().setStrokeWidth(dp2px(3));break;case R.id.width_6:drawView.getPaint().setStrokeWidth(dp2px(6));break;case R.id.emboss://浮雕效果drawView.getPaint().setMaskFilter(new EmbossMaskFilter(new float[] { 0.5f, 1f, 1.5f }, 0.6f, 5f, blurRadius));//float[] direction 用来指示光源照的方向;float ambient 光的强度系数;float specular 镜子的高亮系数;float blurRadius 在使用光之前的模糊不清的面具的宽度break;case R.id.blur://模糊效果blurRadius = drawView.getPaint().getStrokeWidth();drawView.getPaint().setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));break;case R.id.save:Bitmap bitmap = drawView.getCacheBitmap();if (bitmap != null) saveBitmap2Pic(bitmap);else Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();break;default:break;}return true;}/*** 根据手机的分辨率从 dp 的单位 转成为 px(像素)*/public int dp2px(float dpValue) {float scale = getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/** 保存bitmap为图片 */public void saveBitmap2Pic(Bitmap bitmap) {File file = new File(Environment.getExternalStorageDirectory(), new SimpleDateFormat("yyyy.MM.dd HH-mm-ss", Locale.getDefault()).format(new Date()) + ".png");try {FileOutputStream out = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);out.flush();out.close();} catch (Exception e) {Toast.makeText(this, "保存出现异常", Toast.LENGTH_SHORT).show();e.printStackTrace();}}}
View
public class DrawView extends View {private float preX;//前一个点的(x,y)坐标private float preY;private Path path;private Bitmap cacheBitmap = null; //最核心的地方。定义一个内存中的图片,将图片作为缓冲区。大小为屏幕宽高的大小。private Canvas cacheCanvas = null; //定义cacheBitmap的画布private Paint cachePaint = null;//定义cacheBitmap的画笔public Bitmap getCacheBitmap() {return cacheBitmap;}public Paint getPaint() {return cachePaint;}public DrawView(Context context) {this(context, null);}public DrawView(Context context, AttributeSet attrs) {super(context, attrs);cacheBitmap = Bitmap.createBitmap(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels, Config.ARGB_8888);cacheCanvas = new Canvas(cacheBitmap);path = new Path();cachePaint = new Paint();cachePaint.setColor(Color.BLACK);cachePaint.setStyle(Paint.Style.STROKE);cachePaint.setStrokeWidth(1 * context.getResources().getDisplayMetrics().density + 0.5f);//1dpcachePaint.setAntiAlias(true);cachePaint.setDither(true);}@SuppressLint("ClickableViewAccessibility")//意思是:有可能会和点击事件发生冲突,如果你在touch中返回了true,那么就不会响应onClick事件了@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:path.moveTo(x, y);preX = x;preY = y;break;case MotionEvent.ACTION_MOVE:path.quadTo(preX, preY, x, y);//平滑的"贝塞尔曲线"(Bezier curve)。其中,x1,y1为控制点的坐标值,x2,y2为终点的坐标值;//path.lineTo(preX, preY);//由于onTouchEvent事件回调非常频繁,所以用lineTo方法也是可以的preX = x;preY = y;break;case MotionEvent.ACTION_UP:cacheCanvas.drawPath(path, cachePaint);//当手指移开时,把曲线画到cacheCanvas中,在onDraw中又把cacheCanvas画到我们的自定义View中。path.reset();break;default:break;}invalidate();return true;}@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.WHITE);canvas.drawBitmap(cacheBitmap, 0, 0, cachePaint);canvas.drawPath(path, cachePaint);}}
菜单
<!-- <menu>标签是根元素,他没有属性,在<menu>里面可嵌套<item>和<group>子元素 --><menu xmlns:android="http://schemas.android.com/apk/res/android" ><!-- <item>标签表示具体的菜单项,<item>元素中也可嵌套<menu>形成子菜单 --><item android:title="选择颜色"><menu><!-- <group>标签表示一个菜单组,相同的菜单组可以一起设置其属性,checkableBehavior:选择行为:单选、多选 --><group android:checkableBehavior="single" ><itemandroid:id="@+id/red"android:title="红色"/><itemandroid:id="@+id/green"android:title="绿色"/><itemandroid:id="@+id/blue"android:title="蓝色"/></group></menu></item><itemandroid:id="@+id/width_3"android:title="3dp"/><itemandroid:id="@+id/width_6"android:title="6dp"/><itemandroid:id="@+id/blur"android:title="模糊效果"/><itemandroid:id="@+id/emboss"android:title="浮雕效果"/><itemandroid:id="@+id/save"android:title="保存为图片"/></menu>
画画 保存为图片 MaskFilter 边缘效果的更多相关文章
- iOS图片加水印效果的实现并保存至相冊
图片加水印效果的实现并保存至相冊 实现效果如图: project下载:githubproject下载链接 代码: - (void)viewDidLoad { [super viewDidLoad]; ...
- JQuery图片切换动画效果
由于博主我懒,所以页面画的比较粗糙,但是没关系,因为我主要讲的是如何实现图片动画切换. 思路:想必大家都逛过淘宝或者其他的一些网站,一般都会有图片动画切换的效果,那是怎样实现的呢?博主我呢,技术不是很 ...
- ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave由于鼠标移动速度过快导致问题解决办法
记录两个项目开发中遇到的问题,一个是ECharts外部调用保存为图片操作,一个是workflow工作流连接曲线onmouseenter和onmouseleave事件由于鼠标移动过快触发问题. 一.外部 ...
- CSS鼠标悬停图片加边框效果,不位移的方法
<!DOCTYPE HTML> <html lang="en-US"> <head> <title>css实现鼠标悬停时图片加边框效 ...
- 用仿ActionScript的语法来编写html5——第八篇,图片处理+粒子效果
用仿ActionScript的语法来编写html5系列开发到现在,应该可以做出一些东西了,下面先来研究下图片的各种效果预览各种效果看下图效果和代码看这里,看不到效果的请下载支持html5的浏览器 ht ...
- h5页面使用js实现保存当前图片到手机相册
很可惜,这个鬼东西微信内置浏览器不适用 页面: <!doctype html> <html> <head> <meta charset="UTF-8 ...
- js生成二维码并保存成图片下载
我这里使用是jQuery,和jquery.qrcode.js,需要的可以自己找链接下载.示例代码仅做参考 html代码: <a id="downloadLink">&l ...
- Android中使用MediaCodec硬件解码,高效率得到YUV格式帧,快速保存JPEG图片(不使用OpenGL)(附Demo)
MediaCodec的使用demo: https://github.com/vecio/MediaCodecDemo https://github.com/taehwandev/MediaCodecE ...
- 利用LruCache载入网络图片实现图片瀑布流效果(改进版)
PS: 2015年1月20日21:37:27 关于LoadImageAsyncTask和checkAllImageViewVisibility可能有点小bug 改动后的代码请參见升级版本号的代码 ht ...
随机推荐
- 【USACO 2.1.3】三值的排序
[题目描述] 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2和3.我们用交换的方法把他排 ...
- js学习笔记之:键盘应用
为了方便用户操作,可以为用户设置(或者屏蔽)功能键,代替使用频率比较高的操作.本次,将学习一下基本的功能键使用方法.键盘和焦点使用.屏蔽按键等知识点,以及一些相关示例: 1 设置按键功能: 功能键主要 ...
- javascript在一个字符串中每隔多少字符插入某个字符串
function insertStr(str,tar,n,m){ var x='' var str=str.split('') if(str.length==0) return for(var i=n ...
- Spring事务管理中@Transactional的参数配置
Spring作为低侵入的Java EE框架之一,能够很好地与其他框架进行整合,其中Spring与Hibernate的整合实现的事务管理是常用的一种功能. 所谓事务,就必须具备ACID特性,即原子性.一 ...
- linux c数据库备份第四版
该版本算是比较成熟的啦,欢迎大伙拿来试用!!!1.新增数据库连接和备份时间配置文件conf2.新增日志文件,程序运行的一些异常会记录在log文件下 后续的工作:1.将代码切割为多个文件,分类存放代码2 ...
- linux c数据库备份第三版
这个版本相对第一版更新了很多,其实我本地定义为第五版的.相对第一版主要更新内容:1.增加了定时器2.用户可以停止调备份程序3.如果备份程序正在运行,那么尝试运行提示已经在运行4.记录程序运行时的pid ...
- VueJs一些资料网站链接
https://github.com/liukaijv/laravel-vue-cmshttps://github.com/allan2coder/VUE2-SPA-Tutorialhttps://g ...
- JLRoutes--处理复杂的URL schemes-备
关键字:URL,URL schemes,Parse 代码类库:网络(Networking) GitHub链接:https://github.com/joeldev/JLRoutes JLRout ...
- WebApp之Meta标签 (关闭自动识别数字为电话号码或邮箱之类)
iPhone上的Safari(还有些webkit android手机浏览器)会自动对看起来像是电话号码的数字串(包括已经加入连字符或括号格式化过的)添加电话链接,点击之后会询问用户是否想要拨打该号码. ...
- 个人.net学习规划路线
