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

Android編程實現(xiàn)圖片的瀏覽、縮放、拖動和自動居中效果

 更新時間:2015年11月06日 15:33:10   作者:越冬越酷  
這篇文章主要介紹了Android編程實現(xiàn)圖片的瀏覽、縮放、拖動和自動居中效果,以具體實例形式分析了Android針對圖片各種常見顯示效果的布局及功能實現(xiàn)技巧,需要的朋友可以參考下

本文實例講述了Android編程實現(xiàn)圖片的瀏覽、縮放、拖動和自動居中效果的方法。分享給大家供大家參考,具體如下:

Touch.java

/**
 * 圖片瀏覽、縮放、拖動、自動居中
 */
public class Touch extends Activity implements OnTouchListener {
 Matrix matrix = new Matrix();
 Matrix savedMatrix = new Matrix();
 DisplayMetrics dm;
 ImageView imgView;
 Bitmap bitmap;
 float minScaleR;// 最小縮放比例
 static final float MAX_SCALE = 4f;// 最大縮放比例
 static final int NONE = 0;// 初始狀態(tài)
 static final int DRAG = 1;// 拖動
 static final int ZOOM = 2;// 縮放
 int mode = NONE;
 PointF prev = new PointF();
 PointF mid = new PointF();
 float dist = 1f;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.scale);
  imgView = (ImageView) findViewById(R.id.imag);// 獲取控件
  bitmap = BitmapFactory.decodeResource(getResources(), this.getIntent()
    .getExtras().getInt("IMG"));// 獲取圖片資源
  imgView.setImageBitmap(bitmap);// 填充控件
  imgView.setOnTouchListener(this);// 設(shè)置觸屏監(jiān)聽
  dm = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(dm);// 獲取分辨率
  minZoom();
  center();
  imgView.setImageMatrix(matrix);
 }
 /**
  * 觸屏監(jiān)聽
  */
 public boolean onTouch(View v, MotionEvent event) {
  switch (event.getAction() & MotionEvent.ACTION_MASK) {
  // 主點按下
  case MotionEvent.ACTION_DOWN:
   savedMatrix.set(matrix);
   prev.set(event.getX(), event.getY());
   mode = DRAG;
   break;
  // 副點按下
  case MotionEvent.ACTION_POINTER_DOWN:
   dist = spacing(event);
   // 如果連續(xù)兩點距離大于10,則判定為多點模式
   if (spacing(event) > 10f) {
    savedMatrix.set(matrix);
    midPoint(mid, event);
    mode = ZOOM;
   }
   break;
  case MotionEvent.ACTION_UP:
  case MotionEvent.ACTION_POINTER_UP:
   mode = NONE;
   break;
  case MotionEvent.ACTION_MOVE:
   if (mode == DRAG) {
    matrix.set(savedMatrix);
    matrix.postTranslate(event.getX() - prev.x, event.getY()
      - prev.y);
   } else if (mode == ZOOM) {
    float newDist = spacing(event);
    if (newDist > 10f) {
     matrix.set(savedMatrix);
     float tScale = newDist / dist;
     matrix.postScale(tScale, tScale, mid.x, mid.y);
    }
   }
   break;
  }
  imgView.setImageMatrix(matrix);
  CheckView();
  return true;
 }
 /**
  * 限制最大最小縮放比例,自動居中
  */
 private void CheckView() {
  float p[] = new float[9];
  matrix.getValues(p);
  if (mode == ZOOM) {
   if (p[0] < minScaleR) {
    matrix.setScale(minScaleR, minScaleR);
   }
   if (p[0] > MAX_SCALE) {
    matrix.set(savedMatrix);
   }
  }
  center();
 }
 /**
  * 最小縮放比例,最大為100%
  */
 private void minZoom() {
  minScaleR = Math.min(
    (float) dm.widthPixels / (float) bitmap.getWidth(),
    (float) dm.heightPixels / (float) bitmap.getHeight());
  if (minScaleR < 1.0) {
   matrix.postScale(minScaleR, minScaleR);
  }
 }
 private void center() {
  center(true, true);
 }
 /**
  * 橫向、縱向居中
  */
 protected void center(boolean horizontal, boolean vertical) {
  Matrix m = new Matrix();
  m.set(matrix);
  RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
  m.mapRect(rect);
  float height = rect.height();
  float width = rect.width();
  float deltaX = 0, deltaY = 0;
  if (vertical) {
   // 圖片小于屏幕大小,則居中顯示。大于屏幕,上方留空則往上移,下方留空則往下移
   int screenHeight = dm.heightPixels;
   if (height < screenHeight) {
    deltaY = (screenHeight - height) / 2 - rect.top;
   } else if (rect.top > 0) {
    deltaY = -rect.top;
   } else if (rect.bottom < screenHeight) {
    deltaY = imgView.getHeight() - rect.bottom;
   }
  }
  if (horizontal) {
   int screenWidth = dm.widthPixels;
   if (width < screenWidth) {
    deltaX = (screenWidth - width) / 2 - rect.left;
   } else if (rect.left > 0) {
    deltaX = -rect.left;
   } else if (rect.right < screenWidth) {
    deltaX = screenWidth - rect.right;
   }
  }
  matrix.postTranslate(deltaX, deltaY);
 }
 /**
  * 兩點的距離
  */
 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);
 }
}

scale.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:layout_gravity="center" >
 <ImageView
  android:id="@+id/imag"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_gravity="center"
  android:scaleType="matrix" >
 </ImageView>
</FrameLayout>

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • Flutter 構(gòu)建一個常用的頁面框架

    Flutter 構(gòu)建一個常用的頁面框架

    大多數(shù) App 中都會有底部導(dǎo)航欄,通過底部導(dǎo)航欄切換實現(xiàn)不同頁面之間的切換。在Flutter 中提供了 BottomNavigationBar組件實現(xiàn)底部導(dǎo)航。本篇介紹通過 BottomNavigationBar和 IndexedStack構(gòu)建最為常見的 App 頁面框架。
    2021-05-05
  • Android逆向技巧——去除開屏廣告

    Android逆向技巧——去除開屏廣告

    這篇文章主要介紹了Android如何去除開屏廣告,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • Android ListView的item背景色設(shè)置和item點擊無響應(yīng)的解決方法

    Android ListView的item背景色設(shè)置和item點擊無響應(yīng)的解決方法

    在Android開發(fā)中,listview控件是非常常用的控件,在大多數(shù)情況下,大家都會改掉listview的item默認(rèn)的外觀。
    2013-11-11
  • Android 實現(xiàn)手機(jī)接通電話后振動提示的功能

    Android 實現(xiàn)手機(jī)接通電話后振動提示的功能

    本文主要介紹Android 實現(xiàn)手機(jī)接通電話后振動提示的功能,這里整理了詳細(xì)的相關(guān)資料,并附有示例代碼,有需要的朋友可以參考下
    2016-08-08
  • 詳解xamarin Android 實現(xiàn)ListView萬能適配器

    詳解xamarin Android 實現(xiàn)ListView萬能適配器

    這篇文章主要介紹了詳解xamarin Android 實現(xiàn)ListView萬能適配器的相關(guān)資料,這里主要實現(xiàn)listview 適配器的實例,需要的朋友可以參考下
    2017-08-08
  • Android移除Message的方法分享

    Android移除Message的方法分享

    本篇文章主要介紹MessageQueue提供的各種移除Message的方法,大概有八九個,接下來會對其中比較典型的移除方法進(jìn)行詳細(xì)分析,需要的可以參考一下
    2022-10-10
  • Android Studio連接手機(jī)設(shè)備教程

    Android Studio連接手機(jī)設(shè)備教程

    這篇文章主要為大家詳細(xì)介紹了Android Studio連接手機(jī)設(shè)備教程,非常完整的連接步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android編寫簡單的網(wǎng)絡(luò)爬蟲

    Android編寫簡單的網(wǎng)絡(luò)爬蟲

    網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。爬蟲的主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁下載到本地形成一個或聯(lián)網(wǎng)內(nèi)容的鏡像備份。本文的主要內(nèi)容是講在Android中如何編寫簡單的網(wǎng)絡(luò)爬蟲。
    2016-07-07
  • so加載Linker跟NameSpace機(jī)制詳解

    so加載Linker跟NameSpace機(jī)制詳解

    這篇文章主要為大家介紹了so加載Linker跟NameSpace機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android圖片處理實例介紹(圖)

    Android圖片處理實例介紹(圖)

    本篇文章介紹了,Android中圖片處理實例介紹,需要的朋友參考下
    2013-04-04

最新評論

清河县| 漳平市| 将乐县| 鲁甸县| 岳普湖县| 灵寿县| 怀柔区| 吐鲁番市| 米泉市| 射洪县| 商城县| 武乡县| 湟中县| 唐河县| 郎溪县| 北票市| 江油市| 桦甸市| 资阳市| 建昌县| 巧家县| 宜兴市| 明星| 红安县| 丰县| 桂平市| 龙井市| 涞源县| 安远县| 武胜县| 和平区| 霍山县| 镇安县| 睢宁县| 义马市| 凤庆县| 额敏县| 天镇县| 荆州市| 平南县| 仁寿县|