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);


}

}

二:

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);
}
}

Android放大镜的实现的更多相关文章

  1. Android放大镜效果的简单实现

    package com.example.myapi.pictobig; import com.example.myapi.R; import android.content.Context; impo ...

  2. android放大镜效果实现

    概述 我相信很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView ex ...

  3. 移动浏览器Chrome 32 for Android移除300ms点击推迟

    在手机浏览器的一篇文章翻译300ms延迟实用文章,原文地址  http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away 去掉移动设 ...

  4. Android Camera2 Opengles2.0 实时滤镜(冷暖色/放大镜/模糊/美颜)

    https://blog.csdn.net/keen_zuxwang/article/details/78363464 demo: http://download.csdn.net/download/ ...

  5. android UI控件小记

    1.关于text和drawableTop之类的间距 android:drawablePadding="10dp" 2.EditText属性 android:phoneNumber= ...

  6. 详细解读Android中的搜索框—— SearchView

    以前总是自己写的 今天看看别人做的 本篇讲的是如何用searchView实现搜索框,其实原理和之前的没啥差别,也算是个复习吧. 一.Manifest.xml 这里我用一个activity进行信息的输入 ...

  7. Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式

    actionNone : 回车键,按下后光标到下一行actionGo : Go,actionSearch : 放大镜actionSend : SendactionNext : NextactionDo ...

  8. Android 提供的一系列辅助系统开发工具

    除了软件本身的代码之外,Android 还提供了一系列工具来辅助系统开发,这些主要的工具包括: aapt(AndroidAssetPackagingTool):用于建立zip兼容的包(zip.jar. ...

  9. chrome inspect 远程调测:Chrome on Android之一 普通调试

    本文PC环境: Chrome: 版本 33.0.1750.22 dev MAC OS:OS X 10.9.1 特别注意:Chrome DevToolsl使用时会联接到appspot.com,而此网址被 ...

随机推荐

  1. nginx 配置多个主机

    <pre name="code" class="html"> server { listen 8001; server_name localhost ...

  2. mt7601 driver

    http://download.csdn.net/detail/u011500307/7011649 http://my.oschina.net/fgq611/blog/180750 http://b ...

  3. 【转】BLE 学习记录

    原文网址:http://m.blog.csdn.net/blog/chiooo/43985401 BLE 学习记录 ANROID BLE 开发,基于 bluetoothlegatt 分析 mBluet ...

  4. 2015第37周五javascript函数arguments对象巧用一

    Javascript函数的一个巧妙利用:假定action中有一个JSONObject类型的对象data,其值有可能为空,则前台JSP页面的JS代码中想直接通过EL表达式,即${data}的形式访问对象 ...

  5. [转]浏览器如何和Web服务器通信

    http://hi.baidu.com/ywqme/item/b5297014b2e58f4e6826bb74 概述 普通网民打开网页,访问网站,并不需要了解所谓HTTP协议.作为软件工程师,了解一下 ...

  6. Unity3D NGUI制作进度条

    利用GUI可以制作进度条,但是NGUI更加方便 我是用的NGUI3.5.3, 先找到NGUI  Slider的预制体,利用自带的UISlider来制作. 主要是利用UISlider的Value来控制进 ...

  7. __block的作用

    __block 的标记告诉编译器,这个变量在 block 里面需要做特殊处理. 一般来说,在 block 中用的变量值是被复制过来的,所以对于变量本身的修改并不会影响这个变量的真实值.而当我们用 __ ...

  8. HDU--2040

    亲和数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  9. [PWA] 6. Hijacking response

    For example, if the url is not match to any API endpoint, we want to return 404 error message. So fi ...

  10. [转] 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

    为了提高性能,几乎所有互联网应用都有缓存机制,其中Memcache是使用非常广泛的一个分布式缓存系统.众所周知,LAMP是非常经典的Web架构方式,但是随着Nginx的 成熟,越来越多的系统开始转型为 ...