`
chroya
  • 浏览: 661506 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android放大镜的实现

阅读更多

    快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。
    去年某个时候,我偶然看到一篇文章,讲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剪切出一块圆形区域,在其上绘制放大的部分。

    两种方式的效果都一样,如图:

    放大两倍的效果。

 

     放大三倍

 

     貌似还缺点什么,是吧? 嘿嘿,就是放大镜外面缺个框。那玩意,我没资源,所以懒得弄了,有兴趣的自己加吧。


    工程见附件。

4
0
分享到:
评论
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 当放大镜超出图片范围时,程序会异常退出,没有错误报告.

能简单介绍下运行原理吗?
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放大镜实现

    本教程将介绍两种不同的方法来实现Android放大镜功能,并指出在处理大图片时可能遇到的问题,鼓励开发者共同探索优化方案。 1. **自定义View实现放大镜** 自定义View是实现Android放大镜功能的常见方式。你需要...

    android放大镜实现圆周运动动画

    CircleAnimation是自定义动画组件,重写了Animation.applyTransformation, 此方法根据interpolatedTime形参变量实时的计算圆周运动坐标,计算后通过Matrix对象平移控件达到圆周运动动画。

    android 放大镜 Magnifier

    这就是Android放大镜(Magnifier)功能的用途。它可以帮助用户更清晰地看到屏幕上难以辨认的部分,提升用户体验。下面将详细介绍如何在Android中实现一个简单的放大镜效果。 首先,我们要理解Android的Magnifier...

    android放大镜源码实现

    总之,Android放大镜功能的实现涉及到了手势识别、图像处理、动画和视图布局等多个方面的知识。理解并掌握这些原理,对于提升Android开发能力大有裨益。通过分析和研究源码,我们可以更好地理解和应用这些技术。

    android放大镜功能

    在Android开发中,实现“放大镜”功能是一项实用的技术,尤其在阅读小字体或者查看细节时。本篇文章将深入探讨如何在Android应用中创建这样一个功能,以满足用户对局部细节放大查看的需求。 首先,我们需要理解...

    android实现的放大镜

    在Android平台上,实现一个放大镜...综上所述,实现Android放大镜功能需要对Android的图形绘制、手势处理、动画以及性能优化有深入理解。通过以上步骤和策略,你可以为你的应用构建一个高效且用户友好的放大镜功能。

    android放大镜功能源码.zip

    这个“android放大镜功能源码.zip”压缩包很可能是提供了一个实现这一功能的代码示例。下面,我们将详细讨论如何在Android中构建放大镜功能,并涵盖相关的关键知识点。 首先,Android放大镜功能的核心是利用OpenGL ...

    android 图片的放大镜功能 源代码(正方形放大镜)

    本教程将详细解释如何在Android中实现一个正方形的图片放大镜功能,并提供相关的源代码——MagnifierDemo。 首先,我们需要了解放大镜功能的基本原理。放大镜通常由两部分组成:主视图和放大视图。主视图显示原始...

    Android放大镜

    在本文中,我们将深入探讨如何实现一个Android放大镜功能,以及相关的技术要点。 ### 1. 基本原理 Android放大镜的实现主要基于两个关键组件:`SurfaceView`和`Camera`。`SurfaceView`用于创建一个独立的渲染表面...

    Android图片局部放大镜

    在Android开发中,实现“Android图片局部放大镜”的功能是一项常见的需求,特别是在处理地图、细节丰富的图像或文本阅读等场景。这个功能允许用户在不改变整个图片大小的情况下,聚焦并放大图片的特定区域,以便更好...

    android放大镜功能源码.rar

    总之,这个"android放大镜功能源码"提供了Android应用开发中一个实用的组件示例。通过深入研究源代码,开发者不仅可以掌握放大镜功能的实现,还能提升在图形处理和触摸事件处理方面的技能,这对于开发高质量的...

    放大镜基于ArcGISforAndroid

    通过这个项目,开发者不仅可以学习如何使用ArcGIS for Android开发地图应用,还能深入理解如何在Android中实现自定义视图效果,如放大镜。同时,这也有助于提升对触摸事件处理、图像处理和UI设计的理解。对于想要在...

    cococs creator shader 实现放大镜特效

    在Cocos Creator 2.4.4中,实现放大镜特效主要依赖于Shader技术,这是一种图形渲染的关键技术,用于控制游戏或应用中的图像显示方式。Shader可以改变物体表面的颜色、光照、纹理等视觉效果,使其呈现出更加丰富和...

    android 放大镜

    总结起来,"android 放大镜"的实现涉及到了Android图形绘制、手势识别、矩阵变换等多个技术点。通过理解这些知识点,并结合`MyMagnifier1`这个可能包含具体实现的文件,开发者可以创建出一个实用且高效的放大镜功能...

    Android 类似于放大镜源码.rar

    3. **图像处理**:放大镜效果的实现通常需要对捕获的图像进行缩放。这可能涉及到Bitmap对象的缩放操作,如使用Bitmap.createScaledBitmap()方法。同时,为了提供平滑的放大效果,可能还需要处理好图像的分辨率和帧率...

    Android实现放大镜效果的方法实例(附源码)

    总的来说,实现Android放大镜效果的关键在于理解`BitmapShader`、`ShapeDrawable`、`Matrix`和`Path`的工作原理。通过它们,我们可以创建出具有交互性的放大镜视图。这两种方法各有优缺点,开发者可以根据项目的具体...

Global site tag (gtag.js) - Google Analytics