日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android放大鏡效果實(shí)現(xiàn)

概述

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的從江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

我相信很多用過英語應(yīng)用的同學(xué)都看多一個(gè)放大鏡的效果,就是選中一段文字后,會(huì)有一個(gè)放大鏡,這個(gè)究竟怎么實(shí)現(xiàn)的呢,我們今天來分析分析。

 

源碼分析

 
 
 
 
  1. public class ShaderView extends View { 
  2.      private final Bitmap bitmap; 
  3.      private final ShapeDrawable drawable; 
  4.      // 放大鏡的半徑 
  5.      private static final int RADIUS = 80; 
  6.      // 放大倍數(shù) 
  7.      private static final int FACTOR = 3; 
  8.      private final Matrix matrix = new Matrix(); 
  9.   
  10.      public ShaderView(Context context) { 
  11.           super(context); 
  12.           Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.demo); 
  13.           bitmap = bmp; 
  14.           BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(bmp, 
  15.           bmp.getWidth() * FACTOR, bmp.getHeight() * FACTOR, true), TileMode.CLAMP, TileMode.CLAMP); 
  16.   
  17.           // 圓形的drawable 
  18.           drawable = new ShapeDrawable(new OvalShape()); 
  19.           drawable.getPaint().setShader(shader); 
  20.           drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2); 
  21.     } 
  22.   
  23.     @Override 
  24.     public boolean onTouchEvent(MotionEvent event) { 
  25.          final int x = (int) event.getX(); 
  26.          final int y = (int) event.getY(); 
  27.   
  28.          // 這個(gè)位置表示的是,畫shader的起始位置 
  29.          matrix.setTranslate(RADIUS - x * FACTOR, RADIUS - y * FACTOR); 
  30.          drawable.getPaint().getShader().setLocalMatrix(matrix); 
  31.   
  32.          // bounds,就是那個(gè)圓的外切矩形 
  33.          drawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS); 
  34.          invalidate(); 
  35.          return true; 
  36.     } 
  37.   
  38.     @Override 
  39.     public void onDraw(Canvas canvas) { 
  40.          super.onDraw(canvas); 
  41.          canvas.drawBitmap(bitmap, 0, 0, null); 
  42.          drawable.draw(canvas); 
  43.     } 

 

基本原理就是使用ShapeDrawable構(gòu)造一個(gè)圓形的drawable,然后它的paint的shader設(shè)置為將要放大的圖片,然后就是簡(jiǎn)單的位置移動(dòng)問題了。放大鏡的半徑和放大倍數(shù)都可以在代碼里面修改,代碼都有注釋,應(yīng)該很好理解了。

不過,一個(gè)問題如果只有一種解決方法的話,那未免有點(diǎn)令人沮喪,想玩點(diǎn)另類的都不行。玩程序就得玩出個(gè)性,玩出激情。哈哈,廢話太多,切回正題。再來看看放大鏡的另外一種實(shí)現(xiàn)吧

 
 
 
 
  1. public class PathView extends View { 
  2.      private final Path mPath = new Path(); 
  3.      private final Matrix matrix = new Matrix(); 
  4.      private final Bitmap bitmap; 
  5.   
  6.      // 放大鏡的半徑 
  7.      private static final int RADIUS = 80; 
  8.   
  9.      // 放大倍數(shù) 
  10.      private static final int FACTOR = 2; 
  11.      private int mCurrentX, mCurrentY; 
  12.   
  13.      public PathView(Context context) { 
  14.           super(context); 
  15.           mPath.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW); 
  16.           matrix.setScale(FACTOR, FACTOR); 
  17.   
  18.           bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.demo); 
  19.      } 
  20.   
  21.     @Override 
  22.     public boolean onTouchEvent(MotionEvent event) { 
  23.          mCurrentX = (int) event.getX(); 
  24.          mCurrentY = (int) event.getY(); 
  25.   
  26.          invalidate(); 
  27.          return true; 
  28.     } 
  29.   
  30.     @Override 
  31.     public void onDraw(Canvas canvas) { 
  32.          super.onDraw(canvas); 
  33.   
  34.          // 底圖 
  35.          canvas.drawBitmap(bitmap, 0, 0, null); 
  36.   
  37.          // 剪切 
  38.          canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS); 
  39.          canvas.clipPath(mPath); 
  40.   
  41.          // 畫放大后的圖 
  42.          canvas.translate(RADIUS - mCurrentX * FACTOR, RADIUS - mCurrentY * FACTOR); 
  43.          canvas.drawBitmap(bitmap, matrix, null); 
  44.     } 

 

這里使用的是Path類,將canvas剪切出一塊圓形區(qū)域,在其上繪制放大的部分。

工程下載地址http://download.csdn.net/detail/hustpzb/4523274


當(dāng)前題目:Android放大鏡效果實(shí)現(xiàn)
當(dāng)前URL:http://www.5511xx.com/article/djpjhsj.html