国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android放大鏡的實現代碼

Android放大鏡的實現代碼

2021-02-22 12:30Android開發網 Android

這篇文章主要介紹了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剪切出一塊圓形區域,在其上繪制放大的部分。
兩種方式的效果都一樣,如圖:

 

Android放大鏡的實現代碼

放大兩倍的效果。

Android放大鏡的實現代碼

放大三倍

貌似還缺點什么,是吧? 嘿嘿,就是放大鏡外面缺個框。那玩意,我沒資源,所以懶得弄了,有興趣的自己加吧。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美一区二区三区视频在线 | 久久九九99 | 在线观看黄色 | 日韩亚洲一区二区 | 四虎影视 | 国产欧美日韩综合精品一区二区 | 国产精品美女久久久久久免费 | 91精品国产综合久久久久 | 国产精品一区二区三区四区五区 | 寡妇少妇高潮免费看蜜臀a 午夜免费电影 | 一区二区三区在线看 | 激情久久av一区av二区av三区 | 在线天堂av| 久久久久久久久久久免费视频 | 亚洲高清av| 久久综合久久88 | 在线你懂得 | 欧美日韩中文 | 午夜精品视频 | 在线第一页 | 日本日韩中文字幕 | 国产一区二区精品在线观看 | 国产日韩视频在线观看 | 精品久久ai| 欧美福利视频 | 人人九九精 | 五月婷婷丁香在线 | 国产日韩精品一区 | 欧美在线资源 | 婷婷久久综合 | 亚洲精品视频观看 | 欧美在线网 | www久久久 | 黄网在线观看 | 欧美视频免费在线 | 成人在线一区二区三区 | 午夜视频免费在线观看 | 精品久久久久久久久久久 | 国产精品久久天天躁 | 久久久久亚洲精品 | 亚洲电影一区二区 |