Android放大镜的实现代码

快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。
去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现。文章很乱,没有格式,基本上属于看不下去的那种。虽然体裁很有意思,但是我也没有足够的内力把它看完。不过看到一句关键的话,说是使用带圆形的Drawable。这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始尝试,然后就做出来了。现在代码贴出来分享。
Java代码


代码如下:

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设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。

不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。
玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。

再来看看放大镜的另外一种实现吧 ^-^
Java代码


代码如下:

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剪切出一块圆形区域,在其上绘制放大的部分。
两种方式的效果都一样,如图:

放大两倍的效果。

放大三倍

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

(0)

相关推荐

  • Android实现ImageView图片双击放大及缩小

    本文实例介绍了Android实现ImageView图片双击放大及缩小的相关技巧,分享给大家供大家参考,具体内容如下 public class DoubleScaleImageView extends ImageView implements OnTouchListener, OnGlobalLayoutListener { private boolean isFirst = false; private float doubleScale;// 双击放大的值 private Matrix mSc

  • Android App中实现可以双击放大和缩小图片功能的实例

    先来看一个很简单的核心图片缩放方法: public static Bitmap scale(Bitmap bitmap, float scaleWidth, float scaleHeight) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Log.i(TAG, "s

  • Android实现图片反转、翻转、旋转、放大和缩小

    ********************************************************************** android 实现图片的翻转 ********************************************************************** Resources res = this.getContext().getResources(); img = BitmapFactory.decodeResource(res, R.

  • Android实现手势滑动多点触摸放大缩小图片效果

    网上文章虽多,但是这种效果少之又少,我真诚的献上以供大家参考 实现原理:自定义ImageView对此控件进行相应的layout(动态布局). 这里你要明白几个方法执行的流程: 首先ImageView是继承自View的子类. onLayout方法:是一个回调方法.该方法会在在View中的layout方法中执行,在执行layout方法前面会首先执行setFrame方法. setFrame方法:判断我们的View是否发生变化,如果发生变化,那么将最新的l,t,r,b传递给View,然后刷新进行动态更新

  • android中Bitmap的放大和缩小实例代码

    复制代码 代码如下: /**Bitmap放大的方法*/ private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.postScale(1.5f,1.5f); //长和宽放大缩小的比例 Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); return

  • android图像绘制(二)画布上放大缩小问题

    android中图像在画布上放大缩小时,图像的边框大小没有改变! 原图如下: 放大后:原来图片的边框没有改变,位置依旧! 所以如果要放置图片的位置的话,就需要做相应的位置移动才可以! 采用如下代码(全屏放置图片): 复制代码 代码如下: Matrix matrix = new Matrix(); matrix.postScale(canvas.getWidth()*1.01f/bmpBg.getWidth(), canvas.getHeight()*1.01f/bmpBg.getHeight()

  • android 放大镜ShapeDrawable妙用分享

    首先,ShapeDrawable构造的时候可以指定描画的形状, 其次,可以通过shape.getPaint().setShader();指定Shader,shader可以接受一个图片和matrix 所以问题就顺利的解决了:) 具体实现如下:[java] 复制代码 代码如下: float scale = 1.2f; int cx = 224; int cy = 357; int r = 200; // 指定形状创建一个ShapeDrawable  ShapeDrawable shape=new S

  • Android多点触控实现对图片放大缩小平移,惯性滑动等功能

    文章将在原有基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例 实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View.OnTouchListener , V

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

    前言 应该有很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView extends View { private final Bitmap bitmap; private final ShapeDrawable drawable; // 放大镜的半径 private static final int RADIUS = 80; // 放大倍数 private static

  • Android放大镜的实现代码

    快三个月了没写博客了,因为工作调动,很多经验.心得都没有时间记录下来.现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上.进入正题.去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现.文章很乱,没有格式,基本上属于看不下去的那种.虽然体裁很有意思,但是我也没有足够的内力把它看完.不过看到一句关键的话,说是使用带圆形的Drawable.这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始尝试,然后就做出来了.现在代码贴出来分享.Java代码 复制代码 代码如下:

  • 原生JS实现的放大镜效果实例代码

    这是我用原生js写的放大镜效果,与各种各样的框架技术相比,我喜欢使用原生的js,在这里,想和大家一起谈谈原生和框架技术的理解与个人喜好. <!DOCTYPE HTML> <html> <head> <title>js放大镜效果</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <style

  • Android设置铃声实现代码

    本文实例讲述了Android设置铃声实现代码.分享给大家供大家参考.具体如下: public void setMyRingtone(File file) { ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath()); // values.put(MediaStore.MediaColumns.TITLE, file.getName());

  • Android 自定义状态栏实例代码

    一.目标:Android5.0以上 二.步骤 1.在res-values-colors.xml下新建一个RGB颜色 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#3

  • 基于Android实现转盘按钮代码

    先给大家展示下效果图: package com.lixu.circlemenu; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.lixu.circlemenu.view.CircleImageView; import com.lixu.ci

  • Android 日期选择器实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //出生年月设置 private void birthSetting() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_YEAR, 1); new DatePickerDialog(mContext, new DatePickerDialog.OnDateSetListener() { @Override public void onDat

  • Android 滑动拦截实例代码解析

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package demo.hq.com.fby; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; /** * Created by huqing on 2016/12/7.

  • Android 验证码功能实现代码

    先给大家展示下效果图,如果大家感觉还不错,请参考实现代码 很简单的一个例子,点击刷新验证码,刷新当前显示的验证码,点击确定,如果输入的和显示的匹配,就会跳转到下一个界面中,这里只是实现了跳转,并没有进行其它的操作 好了 接下来就是代码了 首先看MainActivity的布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sche

  • Android支付宝支付封装代码

    在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装. 封装的代码也很简单,就是将官网给的demo提取出一个类来方便使用. public class Alipay { // 商户PID public static final String PARTNER = "123456789"; // 商户收款账号 public static final String SELLER = "qibin0506@gmail.co

  • 36个Android开发常用经典代码大全

    本文汇集36个Android开发常用经典代码片段,包括拨打电话.发送短信.唤醒屏幕并解锁.是否有网络连接.动态显示或者是隐藏软键盘等,希望对您有所帮助. //36个Android开发常用代码片段 //拨打电话 public static void call(Context context, String phoneNumber) { context.startActivity( new Intent(Intent.ACTION_CALL, Uri.parse( "tel:" + pho

随机推荐