最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android手勢控制實現(xiàn)縮放、移動圖片

 更新時間:2022年04月23日 17:04:47   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了Android手勢控制實現(xiàn)縮放、移動圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Android手勢控制實現(xiàn)縮放、移動圖片的方法,供大家參考,具體內(nèi)容如下

新建一個觸摸監(jiān)聽器類

package com.liyong.btprinter; 

import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.util.FloatMath; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.ImageView; 

public class MulitPointTouchListener implements OnTouchListener { 

private static final String TAG = "Touch"; 
  // These matrices will be used to move and zoom image 
  Matrix matrix = new Matrix(); 
  Matrix savedMatrix = new Matrix(); 

  // We can be in one of these 3 states 
  static final int NONE = 0; 
  static final int DRAG = 1; 
  static final int ZOOM = 2; 
  int mode = NONE; 

  // Remember some things for zooming 
  PointF start = new PointF(); 
  PointF mid = new PointF(); 
  float oldDist = 1f; 

  @Override 
  public boolean onTouch(View v, MotionEvent event) { 

      ImageView view = (ImageView) v; 
      // Log.e("view_width", 
      // view.getImageMatrix()..toString()+"*"+v.getWidth()); 
      // Dump touch event to log 
      dumpEvent(event); 

      // Handle touch events here... 
      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 

          matrix.set(view.getImageMatrix()); 
          savedMatrix.set(matrix); 
          start.set(event.getX(), event.getY()); 
          //Log.d(TAG, "mode=DRAG"); 
          mode = DRAG; 

          
          //Log.d(TAG, "mode=NONE"); 
          break; 
      case MotionEvent.ACTION_POINTER_DOWN: 
          oldDist = spacing(event); 
          //Log.d(TAG, "oldDist=" + oldDist); 
          if (oldDist > 10f) { 
              savedMatrix.set(matrix); 
              midPoint(mid, event); 
              mode = ZOOM; 
              //Log.d(TAG, "mode=ZOOM"); 
          } 
          break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
          mode = NONE; 
          //Log.e("view.getWidth", view.getWidth() + ""); 
          //Log.e("view.getHeight", view.getHeight() + ""); 

          break; 
      case MotionEvent.ACTION_MOVE: 
          if (mode == DRAG) { 
              // ... 
              matrix.set(savedMatrix); 
              matrix.postTranslate(event.getX() - start.x, event.getY() 
                      - start.y); 
          } else if (mode == ZOOM) { 
              float newDist = spacing(event); 
              //Log.d(TAG, "newDist=" + newDist); 
              if (newDist > 10f) { 
                  matrix.set(savedMatrix); 
                  float scale = newDist / oldDist; 
                  matrix.postScale(scale, scale, mid.x, mid.y); 
              } 
          } 
          break; 
      } 

      view.setImageMatrix(matrix); 
      return true; // indicate event was handled 
  } 

  private void dumpEvent(MotionEvent event) { 
      String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", 
              "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; 
      StringBuilder sb = new StringBuilder(); 
      int action = event.getAction(); 
      int actionCode = action & MotionEvent.ACTION_MASK; 
      sb.append("event ACTION_").append(names[actionCode]); 
      if (actionCode == MotionEvent.ACTION_POINTER_DOWN 
              || actionCode == MotionEvent.ACTION_POINTER_UP) { 
          sb.append("(pid ").append( 
                  action >> MotionEvent.ACTION_POINTER_ID_SHIFT); 
          sb.append(")"); 
      } 
      sb.append("["); 
      for (int i = 0; i < event.getPointerCount(); i++) { 
          sb.append("#").append(i); 
          sb.append("(pid ").append(event.getPointerId(i)); 
          sb.append(")=").append((int) event.getX(i)); 
          sb.append(",").append((int) event.getY(i)); 
          if (i + 1 < event.getPointerCount()) 
              sb.append(";"); 
      } 
      sb.append("]"); 
      //Log.d(TAG, sb.toString()); 
  } 

  
  private float spacing(MotionEvent event) { 
      float x = event.getX(0) - event.getX(1); 
      float y = event.getY(0) - event.getY(1); 
      return FloatMath.sqrt(x * x + y * y); 
  } 

  
  private void midPoint(PointF point, MotionEvent event) { 
      float x = event.getX(0) + event.getX(1); 
      float y = event.getY(0) + event.getY(1); 
      point.set(x / 2, y / 2); 
  } 


}

 

編寫一個xml文件

<?xml version="1.0" encoding="UTF-8"?> 

  <LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical" 
  android:layout_height="fill_parent" 
  android:layout_width="fill_parent" 
  android:id="@+id/linearLayout1" 
  android:weightSum="1"> 
    <ImageView android:layout_width="fill_parent" 
    android:id="@+id/priviewimage" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center" 
    android:scaleType="matrix" 
    > 
   </ImageView> 
  </LinearLayout> 

注意其中的: android:scaleType="matrix"

priviewimage.setImageBitmap(ActivityPreviewImage.click_bitmap); 
priviewimage=(ImageView)findViewById(R.id.priviewimage); 
priviewimage.setOnTouchListener(new MulitPointTouchListener()); 

以上就是Android手勢控制縮放移動圖片的全部代碼,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • Android實現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法

    Android實現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法

    這篇文章主要介紹了Android實現(xiàn)使用流媒體播放遠(yuǎn)程mp3文件的方法,結(jié)合實例形式分析了Android遠(yuǎn)程播放音頻文件的相關(guān)步驟與實現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • Android實現(xiàn)Neumorphism?UI控件

    Android實現(xiàn)Neumorphism?UI控件

    大家好,本篇文章主要講的是Android實現(xiàn)Neumorphism?UI控件,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 關(guān)于Android的 DiskLruCache磁盤緩存機制原理

    關(guān)于Android的 DiskLruCache磁盤緩存機制原理

    DiskLruCache是一種管理數(shù)據(jù)存儲的技術(shù),單從Cache的字面意思也可以理解到,"Cache","高速緩存";今天我們來從源碼上分析下DiskLruCache;關(guān)于Android LruCache的緩存機制原理,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • Android開發(fā)之基本控件和四種布局方式詳解

    Android開發(fā)之基本控件和四種布局方式詳解

    這篇文章主要介紹了Android開發(fā)之基本控件和四種布局方式詳解的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Android自定義實現(xiàn)淘寶下拉刷新效果

    Android自定義實現(xiàn)淘寶下拉刷新效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義實現(xiàn)淘寶下拉刷新效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • android獲取屏幕高度和寬度的實現(xiàn)方法

    android獲取屏幕高度和寬度的實現(xiàn)方法

    這篇文章主要介紹了android獲取屏幕高度和寬度的實現(xiàn)方法,較為詳細(xì)的分析了Android獲取屏幕高度和寬度的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Android線程中設(shè)置控件的值提示報錯的解決方法

    Android線程中設(shè)置控件的值提示報錯的解決方法

    這篇文章主要介紹了Android線程中設(shè)置控件的值提示報錯的解決方法,實例分析了textview報錯的原因以及Handler設(shè)置來解決錯誤的實現(xiàn)技巧,需要的朋友可以參考下
    2016-06-06
  • Android開發(fā)調(diào)用WebService的方法示例

    Android開發(fā)調(diào)用WebService的方法示例

    這篇文章主要介紹了Android開發(fā)調(diào)用WebService的方法,結(jié)合實例形式較為詳細(xì)的分析了Android調(diào)用WebService的原理、實現(xiàn)方法與相關(guān)操作注意事項,需要的朋友可以參考下
    2017-10-10
  • Android多個TAB選項卡切換效果

    Android多個TAB選項卡切換效果

    這篇文章主要介紹了Android多個TAB選項卡切換效果的實現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android中實現(xiàn)Webview頂部帶進(jìn)度條的方法

    Android中實現(xiàn)Webview頂部帶進(jìn)度條的方法

    這篇文章主要介紹了Android中實現(xiàn)Webview頂部帶進(jìn)度條的方法,當(dāng)前很流行的一個效果,就是打開網(wǎng)頁時會在頂部顯示一個打開進(jìn)度條,需要的朋友可以參考下
    2015-01-01

最新評論

西贡区| 平阳县| 吉木萨尔县| 翁牛特旗| 宜春市| 迁安市| 文水县| 济源市| 三河市| 吉安县| 尤溪县| 武陟县| 名山县| 工布江达县| 佳木斯市| 交城县| 平利县| 静乐县| 曲麻莱县| 城市| 谢通门县| 文登市| 卢湾区| 梁平县| 宿迁市| 南木林县| 杭州市| 资兴市| 邮箱| 瑞金市| 泾川县| 蓬莱市| 托里县| 利辛县| 奇台县| 通河县| 中山市| 皋兰县| 铁力市| 漠河县| 丹阳市|