Android中怎么實(shí)現(xiàn)圖片縮放功能

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Android中怎么實(shí)現(xiàn)圖片縮放功能,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)公司專(zhuān)注于企業(yè)全網(wǎng)整合營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、鐘山網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為鐘山等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

布局layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:id="@+id/root"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@color/mywhite"
 android:gravity="center_horizontal"
 android:fitsSystemWindows="true">
 <ImageView
 android:background="@color/light_gery"
 android:scaleType="matrix"
 android:src="@drawable/ic_sure"
 android:id="@+id/hair_iv"
 android:layout_marginTop="50dp"
 android:layout_width="300dp"
 android:layout_height="300dp"/>
</LinearLayout>

先看關(guān)于手勢(shì)觸摸的判斷,需要判斷用戶(hù)是單指觸摸還是雙指,分別在OnTounch的監(jiān)聽(tīng)事件中判斷。

注:先重寫(xiě)onLongClick()方法,不然會(huì)影響OnTouch里面的觸摸監(jiān)聽(tīng)。

 private static final int NONE = 0;
 private static final int DRAG = 1;
 private static final int ZOOM = 2;
 private int mode = NONE;
hairIv.setOnLongClickListener(new View.OnLongClickListener() {
 @Override
 public boolean onLongClick(View v) {
 return true;
 }
 });
 hairIv.setOnTouchListener(new View.OnTouchListener() {
 @Override
 public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction() & MotionEvent.ACTION_MASK) {
 case MotionEvent.ACTION_DOWN:
 //單點(diǎn)觸控
 mode = DRAG;
 break;
 case MotionEvent.ACTION_POINTER_DOWN:
 //多點(diǎn)觸控
 break;
 case MotionEvent.ACTION_MOVE:
 // 手指滑動(dòng)
 if (mode == DRAG) {
 // 是一個(gè)手指拖動(dòng)
 Log.d(TAG, "mode = DRAG" );
 } else if (mode == ZOOM) {
 // 兩個(gè)手指滑動(dòng)
 Log.d(TAG, "mode = ZOOM" );
 }
 break;
 case MotionEvent.ACTION_UP:
 case MotionEvent.ACTION_POINTER_UP:
 // 手指放開(kāi)事件
 mode = NONE;
 break;
 }
 return true;
 }
 });

這些寫(xiě)上之后就可以先看一下單指,雙指的觸摸事件有沒(méi)有被正確處理

通過(guò)Android提供的Matrix類(lèi)對(duì)圖像進(jìn)行處理,關(guān)于Matrix的原理可以看一下Android官方文檔Matrix部分,也可以找一些其他的博客,這里只看使用。

定義要用到的變量

 private Matrix matrix = new Matrix();
 private Matrix savedMatrix = new Matrix();
 // 第一個(gè)按下的手指的點(diǎn)
 private PointF startPoint = new PointF();
 // 兩個(gè)按下的手指的觸摸點(diǎn)的中點(diǎn)
 private PointF midPoint = new PointF();
 // 初始的兩個(gè)手指按下的觸摸點(diǎn)的距離
 private float oriDis = 1f;

在onTouch中完善

@Override
 public boolean onTouch(View v, MotionEvent event) {
 ImageView view = (ImageView) v;
 final int x = (int) event.getRawX();
 final int y = (int) event.getRawY();
 Log.d(TAG, "onTouch: x= " + x + "y=" + y);
 switch (event.getAction() & MotionEvent.ACTION_MASK) {
 case MotionEvent.ACTION_DOWN:
 //單點(diǎn)觸控
 matrix.set(view.getImageMatrix());
 savedMatrix.set(matrix);
 startPoint.set(event.getX(), event.getY());
 mode = DRAG;
 break;
 case MotionEvent.ACTION_POINTER_DOWN:
 //多點(diǎn)觸控
 oriDis = distance(event);
 if (oriDis > 10f) {
 savedMatrix.set(matrix);
 midPoint = midPoint(event);
 mode = ZOOM;
 }
 break;
 case MotionEvent.ACTION_MOVE:
 // 手指滑動(dòng)事件
 if (mode == DRAG) {
 // 是一個(gè)手指拖動(dòng)
 matrix.set(savedMatrix);
 matrix.postTranslate(event.getX() - startPoint.x, event.getY()
  - startPoint.y);
 } else if (mode == ZOOM) {
 // 兩個(gè)手指滑動(dòng)
 float newDist = distance(event);
 if (newDist > 10f) {
 matrix.set(savedMatrix);
 float scale = newDist / oriDis;
 matrix.postScale(scale, scale, midPoint.x, midPoint.y);
 }
 }
 break;
 case MotionEvent.ACTION_UP:
 case MotionEvent.ACTION_POINTER_UP:
 // 手指放開(kāi)事件
 mode = NONE;
 break;
 }
 view.setImageMatrix(matrix);
 return true;
 }

其中用到的計(jì)算位置和距離的方法

 /**
 * 計(jì)算兩個(gè)手指頭之間的中心點(diǎn)的位置
 * x = (x1+x2)/2;
 * y = (y1+y2)/2;
 *
 * @param event 觸摸事件
 * @return 返回中心點(diǎn)的坐標(biāo)
 */
 private PointF midPoint(MotionEvent event) {
 float x = (event.getX(0) + event.getX(1)) / 2;
 float y = (event.getY(0) + event.getY(1)) / 2;
 return new PointF(x, y);
 }
 /**
 * 計(jì)算兩個(gè)手指間的距離
 *
 * @param event 觸摸事件
 * @return 放回兩個(gè)手指之間的距離
 */
 private float distance(MotionEvent event) {
 float x = event.getX(0) - event.getX(1);
 float y = event.getY(0) - event.getY(1);
 return (float) Math.sqrt(x * x + y * y);//兩點(diǎn)間距離公式
 }

3 源碼

public class ImageActivity extends AppCompatActivity{
 @BindView(R.id.hair_iv)
 ImageView hairIv;
 private static final int NONE = 0;
 private static final int DRAG = 1;
 private static final int ZOOM = 2;
 private int mode = NONE;
 private Matrix matrix = new Matrix();
 private Matrix savedMatrix = new Matrix();
 // 第一個(gè)按下的手指的點(diǎn)
 private PointF startPoint = new PointF();
 // 兩個(gè)按下的手指的觸摸點(diǎn)的中點(diǎn)
 private PointF midPoint = new PointF();
 // 初始的兩個(gè)手指按下的觸摸點(diǎn)的距離
 private float oriDis = 1f;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_image);
 ButterKnife.bind(this);
 hairIv.setOnLongClickListener(new View.OnLongClickListener() {
 @Override
 public boolean onLongClick(View v) {
 return true;
 }
 });
 hairIv.setOnTouchListener(new View.OnTouchListener() {
 @Override
 public boolean onTouch(View v, MotionEvent event) {
 ImageView view = (ImageView) v;
 final int x = (int) event.getRawX();
 final int y = (int) event.getRawY();
 Log.d(TAG, "onTouch: x= " + x + "y=" + y);
 switch (event.getAction() & MotionEvent.ACTION_MASK) {
 case MotionEvent.ACTION_DOWN:
 //單點(diǎn)觸控
 matrix.set(view.getImageMatrix());
 savedMatrix.set(matrix);
 startPoint.set(event.getX(), event.getY());
 mode = DRAG;
 break;
 case MotionEvent.ACTION_POINTER_DOWN:
 //多點(diǎn)觸控
 oriDis = distance(event);
 if (oriDis > 10f) {
 savedMatrix.set(matrix);
 midPoint = midPoint(event);
 mode = ZOOM;
 }
 break;
 case MotionEvent.ACTION_MOVE:
 // 手指滑動(dòng)事件
 if (mode == DRAG) {
 // 是一個(gè)手指拖動(dòng)
 matrix.set(savedMatrix);
 matrix.postTranslate(event.getX() - startPoint.x, event.getY()
  - startPoint.y);
 } else if (mode == ZOOM) {
 // 兩個(gè)手指滑動(dòng)
 float newDist = distance(event);
 if (newDist > 10f) {
 matrix.set(savedMatrix);
 float scale = newDist / oriDis;
 matrix.postScale(scale, scale, midPoint.x, midPoint.y);
 }
 }
 break;
 case MotionEvent.ACTION_UP:
 case MotionEvent.ACTION_POINTER_UP:
 // 手指放開(kāi)事件
 mode = NONE;
 break;
 }
 view.setImageMatrix(matrix);
 return true;
 }
 });
 }
 /**
 * 計(jì)算兩個(gè)手指頭之間的中心點(diǎn)的位置
 * x = (x1+x2)/2;
 * y = (y1+y2)/2;
 *
 * @param event 觸摸事件
 * @return 返回中心點(diǎn)的坐標(biāo)
 */
 private PointF midPoint(MotionEvent event) {
 float x = (event.getX(0) + event.getX(1)) / 2;
 float y = (event.getY(0) + event.getY(1)) / 2;
 return new PointF(x, y);
 }
 /**
 * 計(jì)算兩個(gè)手指間的距離
 *
 * @param event 觸摸事件
 * @return 放回兩個(gè)手指之間的距離
 */
 private float distance(MotionEvent event) {
 float x = event.getX(0) - event.getX(1);
 float y = event.getY(0) - event.getY(1);
 return (float) Math.sqrt(x * x + y * y);//兩點(diǎn)間距離公式
 }
 }

上述就是小編為大家分享的Android中怎么實(shí)現(xiàn)圖片縮放功能了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞名稱(chēng):Android中怎么實(shí)現(xiàn)圖片縮放功能
文章分享:http://bm7419.com/article10/gipcgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、品牌網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、Google、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)

網(wǎng)站設(shè)計(jì)公司知識(shí)