- 浏览: 661506 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 4372目录: Android NFC ... -
Android简单的圆盘形菜单
2010-12-01 17:10 15509今天偶然看到一个圆盘形的菜单,还可以转动,感觉挺 ... -
Android的3D旋转
2010-11-29 12:27 23211见过没有用opengl的3D动画,看了一下,是 ... -
让自己的Android应用支持appwidget
2010-11-26 13:25 7853经常看到一些教程教你如何写appwidget, ... -
ConditionVariable的用法
2010-11-07 21:35 8758线程操作经常用到wait和notify,用起来稍显 ... -
Android自定义长按事件
2010-11-06 20:34 44724Android系统自带了长按事件,setOnLongC ... -
Android获取应用程序的大小
2010-10-22 23:53 11257今天碰到个问 ... -
Android获取其他包的Context实例然后干坏事
2010-09-12 14:55 25141Android中有Context ... -
android监听文件和目录的创建删除移动等事件
2010-09-11 21:18 13682android.os下的FileObserver类 ... -
解决android自定义标题栏充满的问题
2010-09-10 15:27 10802一个接着一个的activity,写啊写,调啊调 ... -
Android中用AsyncTask简单实现多线程
2010-09-07 14:11 5237一般情况下在an ... -
Android自由选择TextView的文字
2010-09-02 15:47 19425用过EditText的都 ... -
NDK入门、提高和实战
2010-08-04 18:25 3299网上也有一些对NDK ... -
linux下用adb连接手机的问题解决
2010-08-02 16:17 6069在linux里面,模拟器可以直接识别,使用adb也 ... -
Android系统事件的recycle原理
2010-07-22 19:07 6262最近封装一些功能 ... -
Android画图之Matrix(二)
2010-07-15 22:01 34078上一篇Android画图之Matrix(一) 讲 ... -
Android画图之Matrix(一)
2010-07-13 22:54 32912Matrix ,中文里叫矩阵, ... -
Android画图之Bitmap(二)
2010-07-11 22:21 10835前面一篇博文Android画图之Bitma ... -
Android画图之Bitmap(一)
2010-07-11 19:51 15692最近写电子书 ...
相关推荐
本教程将介绍两种不同的方法来实现Android放大镜功能,并指出在处理大图片时可能遇到的问题,鼓励开发者共同探索优化方案。 1. **自定义View实现放大镜** 自定义View是实现Android放大镜功能的常见方式。你需要...
CircleAnimation是自定义动画组件,重写了Animation.applyTransformation, 此方法根据interpolatedTime形参变量实时的计算圆周运动坐标,计算后通过Matrix对象平移控件达到圆周运动动画。
这就是Android放大镜(Magnifier)功能的用途。它可以帮助用户更清晰地看到屏幕上难以辨认的部分,提升用户体验。下面将详细介绍如何在Android中实现一个简单的放大镜效果。 首先,我们要理解Android的Magnifier...
总之,Android放大镜功能的实现涉及到了手势识别、图像处理、动画和视图布局等多个方面的知识。理解并掌握这些原理,对于提升Android开发能力大有裨益。通过分析和研究源码,我们可以更好地理解和应用这些技术。
在Android开发中,实现“放大镜”功能是一项实用的技术,尤其在阅读小字体或者查看细节时。本篇文章将深入探讨如何在Android应用中创建这样一个功能,以满足用户对局部细节放大查看的需求。 首先,我们需要理解...
在Android平台上,实现一个放大镜...综上所述,实现Android放大镜功能需要对Android的图形绘制、手势处理、动画以及性能优化有深入理解。通过以上步骤和策略,你可以为你的应用构建一个高效且用户友好的放大镜功能。
这个“android放大镜功能源码.zip”压缩包很可能是提供了一个实现这一功能的代码示例。下面,我们将详细讨论如何在Android中构建放大镜功能,并涵盖相关的关键知识点。 首先,Android放大镜功能的核心是利用OpenGL ...
本教程将详细解释如何在Android中实现一个正方形的图片放大镜功能,并提供相关的源代码——MagnifierDemo。 首先,我们需要了解放大镜功能的基本原理。放大镜通常由两部分组成:主视图和放大视图。主视图显示原始...
在本文中,我们将深入探讨如何实现一个Android放大镜功能,以及相关的技术要点。 ### 1. 基本原理 Android放大镜的实现主要基于两个关键组件:`SurfaceView`和`Camera`。`SurfaceView`用于创建一个独立的渲染表面...
在Android开发中,实现“Android图片局部放大镜”的功能是一项常见的需求,特别是在处理地图、细节丰富的图像或文本阅读等场景。这个功能允许用户在不改变整个图片大小的情况下,聚焦并放大图片的特定区域,以便更好...
总之,这个"android放大镜功能源码"提供了Android应用开发中一个实用的组件示例。通过深入研究源代码,开发者不仅可以掌握放大镜功能的实现,还能提升在图形处理和触摸事件处理方面的技能,这对于开发高质量的...
通过这个项目,开发者不仅可以学习如何使用ArcGIS for Android开发地图应用,还能深入理解如何在Android中实现自定义视图效果,如放大镜。同时,这也有助于提升对触摸事件处理、图像处理和UI设计的理解。对于想要在...
在Cocos Creator 2.4.4中,实现放大镜特效主要依赖于Shader技术,这是一种图形渲染的关键技术,用于控制游戏或应用中的图像显示方式。Shader可以改变物体表面的颜色、光照、纹理等视觉效果,使其呈现出更加丰富和...
总结起来,"android 放大镜"的实现涉及到了Android图形绘制、手势识别、矩阵变换等多个技术点。通过理解这些知识点,并结合`MyMagnifier1`这个可能包含具体实现的文件,开发者可以创建出一个实用且高效的放大镜功能...
3. **图像处理**:放大镜效果的实现通常需要对捕获的图像进行缩放。这可能涉及到Bitmap对象的缩放操作,如使用Bitmap.createScaledBitmap()方法。同时,为了提供平滑的放大效果,可能还需要处理好图像的分辨率和帧率...
总的来说,实现Android放大镜效果的关键在于理解`BitmapShader`、`ShapeDrawable`、`Matrix`和`Path`的工作原理。通过它们,我们可以创建出具有交互性的放大镜视图。这两种方法各有优缺点,开发者可以根据项目的具体...