android 放大镜
转自http://chroya.iteye.com/blog/924577
快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。 去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现。文章很乱,没有格式,基本上属于看不下去的那种。虽然体裁很有意思,但是我也没有足够的内力把它看完。不过看到一句关键的话,说是使用带圆形的Drawable。这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始尝试,然后就做出来了。现在代码贴出来分享。Java代码 package chroya.demo.magnifier; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Shader.TileMode; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.view.MotionEvent; import android.view.View; /** * 放大镜实现方式1 * @author chroya * */ public class ShaderView extends View{ private Bitmap bitmap; private ShapeDrawable drawable; //放大镜的半径 private static final int RADIUS = 80; //放大倍数 private static final int FACTOR = 3; private Matrix matrix = new Matrix(); public ShaderView(Context context) { super(context); Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.show); bitmap = bmp; BitmapShader shader = new BitmapShader( Bitmap.createScaledBitmap(bmp, bmp.getWidth()*FACTOR, bmp.getHeight()*FACTOR, true), TileMode.CLAMP, TileMode.CLAMP); //圆形的drawable drawable = new ShapeDrawable(new OvalShape()); drawable.getPaint().setShader(shader); drawable.setBounds(0, 0, RADIUS*2, RADIUS*2); } @Override public boolean onTouchEvent(MotionEvent event) { final int x = (int) event.getX(); final int y = (int) event.getY(); //这个位置表示的是,画shader的起始位置 matrix.setTranslate(RADIUS-x*FACTOR, RADIUS-y*FACTOR); drawable.getPaint().getShader().setLocalMatrix(matrix); //bounds,就是那个圆的外切矩形 drawable.setBounds(x-RADIUS, y-RADIUS, x+RADIUS, y+RADIUS); invalidate(); return true; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bitmap, 0, 0, null); drawable.draw(canvas); } } 基本原理就是使用ShapeDrawable构造一个圆形的drawable,然后它的paint的shader设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。 不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。 玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。 再来看看放大镜的另外一种实现吧 ^-^Java代码 package chroya.demo.magnifier; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Path; import android.graphics.Path.Direction; import android.view.MotionEvent; import android.view.View; /** * 放大镜实现方式2 * @author chroya * */ public class PathView extends View{ private Path mPath = new Path(); private Matrix matrix = new Matrix(); private Bitmap bitmap; //放大镜的半径 private static final int RADIUS = 80; //放大倍数 private static final int FACTOR = 2; private int mCurrentX, mCurrentY; public PathView(Context context) { super(context); mPath.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW); matrix.setScale(FACTOR, FACTOR); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.show); } @Override public boolean onTouchEvent(MotionEvent event) { mCurrentX = (int) event.getX(); mCurrentY = (int) event.getY(); invalidate(); return true; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); //底图 canvas.drawBitmap(bitmap, 0, 0, null); //剪切 canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS); canvas.clipPath(mPath); //画放大后的图 canvas.translate(RADIUS-mCurrentX*FACTOR, RADIUS-mCurrentY*FACTOR); canvas.drawBitmap(bitmap, matrix, null); } } 这里使用的是Path类,将canvas剪切出一块圆形区域,在其上绘制放大的部分。 两种方式的效果都一样,如图: 放大两倍的效果。 放大三倍 貌似还缺点什么,是吧? 嘿嘿,就是放大镜外面缺个框。那玩意,我没资源,所以懒得弄了,有兴趣的自己加吧。 工程见附件。
编辑器加载中...
转载于:https://www.cnblogs.com/meieiem/archive/2011/11/15/2249181.html
android 放大镜相关推荐
- android放大镜无广告,Android放大镜的实现代码
快三个月了没写博客了,因为工作调动,很多经验.心得都没有时间记录下来.现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上.进入正题. 去年某个时候,我偶然看到一篇文章,讲android里面 ...
- android 放大镜动画,Android在图片上进行放大镜效果(放大镜形状)
Android 图片上放大镜效果实现 1.[文件] ZoomView.java ~ 5KB 下载(55) package com.study.hello; import android.con ...
- android 放大镜 Magnifier 简单实现
public class MainActivity extends Activity implements OnTouchListener {private int x;//绘画开始的横坐标 priv ...
- android 放大镜功能,Android实现放大镜效果的方法实例(附源码)
前言 应该有很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView ex ...
- android 各类demo链接
http://gundumw100.iteye.com/blog/940084 带磁性的悬浮窗体,类似于360绿色小人 主要实现的是: 1.悬浮所有窗体之上 2.有吸引力,吸附于屏幕边上 3. ...
- android代码精华 各路大神写的代码精华,大家一起分享
http://blog.csdn.net/kan1kan5/article/details/41960259 http://gundumw100.iteye.com/blog/940084 带磁性的悬 ...
- Android图片不规则裁剪
demo链接: Android自定义不规则裁剪 扩展链接: Android:谈谈最被误读的属性adjustViewBounds 定义:1.adjustViewBounds影响的是ImageView的比 ...
- linux命令hwclock,Linux命令之hwclock - 查询和设置硬件时钟
常用参数 -r, --show 读取并打印硬件时钟(read hardware clock and print result ) -s, --hctosys 将硬件时钟同步到 ...
- android图片凹凸效果,图像滤镜处理算法:柔化、光照、放大镜、哈哈镜
本文的最后提供了完整的Android工程下载,图像处理部分主要采用JNI,算法使用C实现,因为在开发过程中发现使用Java来进行数值处理时,速度绝对是不堪忍受的.现在代码中依然保留了一些Java的滤镜 ...
最新文章
- 【ACM】杭电OJ 1106 函数atoi
- .net 开源组件推荐 之 StackExchange
- 软件测试艺术一:程序正确性证明
- js操作元素节点对象innerHTML
- J2EE中下载和安装spring插件
- v-model数据绑定分析
- 太惨了,今年没年终奖了!
- 基于JAVA+SpringMVC+Mybatis+MYSQL的OA办公系统
- DLA SQL分析函数:SQL语句审计与分析的利器
- 阿里Seata的分布式事务实现
- Blender 常用快捷键记录 (二)
- 如何在linux上运行asp网站,linux上搭建asp网站
- 报错: com.alibaba.druid.pool.DruidDataSource : abandon connection, owner thread
- wait和notify,sleep
- 无线智能报警暨家电控制
- 宇视摄像头尾线防水处理
- dellT440和T620重装系统问题总结
- 系统设计-网关(一)
- 数据结构与算法-单链表的常见面试题(单链表的长度,单链表倒数第k个数据)
- oracle 查看scott权限,Oracle创建表空间、创建用户以及授权、查看权限 、scott解锁...