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. 利用over开窗函数取第一条记录

    SQL> set linesize 200 SQL> select * from (select a.* ,row_number() over( order by empno) rn  f ...

  2. Majority Element II——LeetCode

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  3. svn server安装配置

    安装平台:RHEL5 1.安装软件:httpd.subversion.mod_dav_svn 2.修改配置 修改/etc/httpd/conf.d/subversion.conf.eg: LoadMo ...

  4. 路由器刷机常见第三方固件及管理前端种类(OpenWrt、Tomato、DD-Wrt)

    目前路由器折腾刷机,除了采用各品牌的原厂固件外,第三方路由器固件,基本就是:Tomato.DD-WRT.OpenWRT三种. 基本上所有第三方路由器固件的架构上可分为前端(Frontend)和后端(B ...

  5. 分页过滤SQL求总条数SQL正则

    public static void main(String[] args) throws Exception { String queryForScanUsers_SQL = "selec ...

  6. myeclipse 闪退解决方法

    今天提交一个svn文件发生卡死,然后关闭myeclipse后发生,打开myeclipse出险闪退,摸索半天,发现: 只要修改下工作空间的名称,然后打开myeclipse重新导入即可,只是之前的配置都没 ...

  7. Redis sort命令

    http://www.cnblogs.com/linjiqin/archive/2013/06/14/3135921.html 1.添加 投票选项到 redis的  List 和HashMap lis ...

  8. 6th day

    时光荏苒,岁月如梭,2016年马上就要过去了,今天PHP的核心知识基本上已经讲完,后面就要开始学习数据库,做项目之类的,心情还真是有点小激动.总之,新年新气象,祝愿各位在新的一年里能够心想事成,好好学 ...

  9. SafeNet推出行业首款白盒password软件保护解决方式

    数据保护领域的全球率先企业SafeNet公司日前宣布,推出行业首款採用白盒安全技术的的软件保护方案.SafeNet 圣天诺 软件授权与保护解决方式如今纳入了新的功能,可在"白盒" ...

  10. 卸载Symantec Endpoint Protection, 无需password的卸载方法

    近期一次偶然的机会, 被人装了个Symantec在电脑上, 搞得各种报警, 验证, 烦死. 然后就自然而然的想卸载掉这个该死的杀毒软件, 没想到这个杀毒软件竟然还是个流氓杀毒软件, 卸载还须要pass ...