- 浏览: 656468 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ZHOU452840622:
少了一个构造函数 晕
Android画图之Matrix(一) -
ZHOU452840622:
06-30 17:39:19.193: E/AndroidRu ...
Android画图之Matrix(一) -
ZHOU452840622:
为什么报错哦
Android画图之Matrix(一) -
悬空90:
只是获取activity的名字而已, 没有实例。 反射 ...
获取屏幕上正在显示的activity -
night_iv:
重写下面两个函数EditText完全作废,点击没有反应没有光标 ...
Android自由选择TextView的文字
快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。
去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现。文章很乱,没有格式,基本上属于看不下去的那种。虽然体裁很有意思,但是我也没有足够的内力把它看完。不过看到一句关键的话,说是使用带圆形的Drawable。这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始尝试,然后就做出来了。现在代码贴出来分享。
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设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。
不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。
玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。
再来看看放大镜的另外一种实现吧 ^-^
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剪切出一块圆形区域,在其上绘制放大的部分。
两种方式的效果都一样,如图:
放大两倍的效果。
放大三倍
貌似还缺点什么,是吧? 嘿嘿,就是放大镜外面缺个框。那玩意,我没资源,所以懒得弄了,有兴趣的自己加吧。
工程见附件。
- Magnifier.zip (221 KB)
- 下载次数: 817
评论
9 楼
老鼠头007
2012-02-24
多谢楼主的分享,收益很多,期待你更好的文章,只是,小弟我还有个问题还望楼主有时间指教一下,我用webview实现了网页缩小放大的功能,只是自带的老显示一个放大镜,请问有没有办法让这个放大镜不显示,我用的是多点触摸缩放,不需要这个放大镜
8 楼
flyingsir_zw
2012-02-22
package chroya.demo.magnifier;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new ShaderView(this));
// setContentView(new PathView(this));
}
}
ShaderView 当放大镜超出图片范围时,程序会异常退出,没有错误报告.
能简单介绍下运行原理吗?
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new ShaderView(this));
// setContentView(new PathView(this));
}
}
ShaderView 当放大镜超出图片范围时,程序会异常退出,没有错误报告.
能简单介绍下运行原理吗?
7 楼
琼露露
2011-10-26
已读,嘿嘿.
6 楼
chroya
2011-04-07
a54cc 写道
还记得你看的那篇看不下去的文章么,也想看一下。
去年的事了,而且还是偶然看到的,没有记下地址,sorry了
5 楼
a54cc
2011-04-07
还记得你看的那篇看不下去的文章么,也想看一下。
4 楼
lijiaji_hy
2011-03-18
chroya 写道
lijiaji_hy 写道
“貌似还缺点什么,就是放大镜外面缺个框” 你先把它做成针对屏幕放大吧,做到对固定的图片放大没有任何义意,有没有框不是最关键的。
你的意思是放大当前屏幕的内容,不论屏幕上显示的是什么?
正是!放大当前屏幕的内容。方便透露一下吗?你目前从事那方面的Android应用开发,你所在的工司在Android上面的发展的前景怎么样?
3 楼
chroya
2011-03-07
lijiaji_hy 写道
“貌似还缺点什么,就是放大镜外面缺个框” 你先把它做成针对屏幕放大吧,做到对固定的图片放大没有任何义意,有没有框不是最关键的。
你的意思是放大当前屏幕的内容,不论屏幕上显示的是什么?
2 楼
lijiaji_hy
2011-03-07
“貌似还缺点什么,就是放大镜外面缺个框” 你先把它做成针对屏幕放大吧,做到对固定的图片放大没有任何义意,有没有框不是最关键的。
1 楼
ET焖猪仔
2011-02-27
多谢楼主分享,期待你后面的文章
发表评论
-
Android NFC内部机制分析
2012-08-06 19:48 3一、初始 一般需要使用nfc ... -
Android NFC简介
2012-08-03 11:31 4287目录: Android NFC ... -
Android简单的圆盘形菜单
2010-12-01 17:10 15394今天偶然看到一个圆盘形的菜单,还可以转动,感觉挺 ... -
Android的3D旋转
2010-11-29 12:27 23102见过没有用opengl的3D动画,看了一下,是 ... -
让自己的Android应用支持appwidget
2010-11-26 13:25 7761经常看到一些教程教你如何写appwidget, ... -
ConditionVariable的用法
2010-11-07 21:35 8662线程操作经常用到wait和notify,用起来稍显 ... -
Android自定义长按事件
2010-11-06 20:34 44600Android系统自带了长按事件,setOnLongC ... -
Android获取应用程序的大小
2010-10-22 23:53 11194今天碰到个问 ... -
Android获取其他包的Context实例然后干坏事
2010-09-12 14:55 25062Android中有Context ... -
android监听文件和目录的创建删除移动等事件
2010-09-11 21:18 13618android.os下的FileObserver类 ... -
解决android自定义标题栏充满的问题
2010-09-10 15:27 10752一个接着一个的activity,写啊写,调啊调 ... -
Android中用AsyncTask简单实现多线程
2010-09-07 14:11 5172一般情况下在an ... -
Android自由选择TextView的文字
2010-09-02 15:47 19244用过EditText的都 ... -
NDK入门、提高和实战
2010-08-04 18:25 3253网上也有一些对NDK ... -
linux下用adb连接手机的问题解决
2010-08-02 16:17 5982在linux里面,模拟器可以直接识别,使用adb也 ... -
Android系统事件的recycle原理
2010-07-22 19:07 6214最近封装一些功能 ... -
Android画图之Matrix(二)
2010-07-15 22:01 33951上一篇Android画图之Matrix(一) 讲 ... -
Android画图之Matrix(一)
2010-07-13 22:54 32812Matrix ,中文里叫矩阵, ... -
Android画图之Bitmap(二)
2010-07-11 22:21 10766前面一篇博文Android画图之Bitma ... -
Android画图之Bitmap(一)
2010-07-11 19:51 15621最近写电子书 ...
相关推荐
该工程教给你两种实现放大镜的方式,不过对于大图片,程序还处理不了,希望大家一起优化
CircleAnimation是自定义动画组件,重写了Animation.applyTransformation, 此方法根据interpolatedTime形参变量实时的计算圆周运动坐标,计算后通过Matrix对象平移控件达到圆周运动动画。
android放大镜源码实现
android点击、移动时将指定区域放大显示,实现"放大镜"效果
android实现的放大镜, 效果非常的不错!
android 简单的放大镜 实现 Magnifier
android 图片的放大镜功能 源代码(正方形放大镜) 类似淘宝 简单实现
主要介绍了Android放大镜的实现代码,有需要的朋友可以参考一下
主要给大家介绍了利用Android实现放大镜效果的方法实例,文中给出了详细的介绍和示例代码,文章的结尾更是给出了源码供大家下载学习,有需要的朋友们下面来一起看看吧。
android上想实现局部放大的效果,比如画面中加个放大镜的效果,发现ShapeDrawable是一个最好的选择。
利用之前学过的图形图像绘画技术和图片添加特效技术,我们来实现一个Android放大镜的简单应用。 最终效果如图 具体实现: 用来显示自定义的绘图类的布局文件 res/layout/main.xml: <?xml version=1.0 encoding...
android 图片的放大镜功能 源代码(正方形放大镜) 类似淘宝 简单实现.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
本资源主要解决了二维码较小时识别率低的问题,在扫描的时候不断放大镜头实现近距离扫描二维码,同时支持打开相册扫描,打开闪光灯,创建二维码等功能,同时识别率高。
本例子是一个引导页聚焦引导效果的例子源码,启动引导的时候除了设置的引导区域以外的所有地方都是半透明的黑色,点击第一个引导位置会转跳到第二个引导位置,下面的引导位置以此类推,默认编译版本4.4.2编码GBK
android系统下悬浮窗口的设计,可以实现在所有程序上面悬浮