Android實(shí)現(xiàn)圖片拖拉功能
這次記錄的是實(shí)現(xiàn)Android圖片用手拖拉的功能,,供大家參考,具體內(nèi)容如下
編譯環(huán)境:eclipse
Android版本4.0
創(chuàng)建工程過程略
實(shí)現(xiàn)圖片在頁面內(nèi)的拖拉
原理圖:

計(jì)算出手指移動(dòng)的位移,通過matrix矩陣對象,將圖片空間矩陣化之后根據(jù)手指位移讓矩陣移動(dòng),
從而達(dá)到圖片移動(dòng)的效果
實(shí)現(xiàn)圖片在頁面內(nèi)的拖拉
mian.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context="com.example.dragscale.MainActivity" > <!--scaleType="matrix"采用矩陣來實(shí)現(xiàn)圖片的拖拉或放大--> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/keep" android:scaleType="matrix" android:id="@+id/image"/> </LinearLayout>
MainActivity.java:
package com.example.dragscale;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView imageView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(ImageView)this.findViewById(R.id.image);
//添加觸摸監(jiān)聽對象(控件被觸摸就會觸發(fā)TouchListener類)
imageView.setOnTouchListener(new TouchListener());
}
private final class TouchListener implements OnTouchListener{
private PointF startPoint= new PointF();//PointF(浮點(diǎn)對)
private Matrix matrix=new Matrix();//矩陣對象
private Matrix currentMatrix=new Matrix();//存放照片當(dāng)前的矩陣
//參數(shù)1:用戶觸摸的控件;參數(shù)2:用戶觸摸所產(chǎn)生的事件
public boolean onTouch(View v, MotionEvent event) {
//判斷事件的類型
//得到低八位才能獲取動(dòng)作,所以要屏蔽高八位(通過與運(yùn)算&255)
//ACTION_MASK就是一個(gè)常量,代表255
switch (event.getAction()&MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN://手指下壓
currentMatrix.set(imageView.getImageMatrix());//記錄ImageView當(dāng)前的移動(dòng)位置
startPoint.set(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE://手指在屏幕移動(dòng),改事件會不斷被調(diào)用
float dx=event.getX()-startPoint.x;//得到在x軸的移動(dòng)距離
float dy=event.getY()-startPoint.y;//得到在y軸的移動(dòng)距離
matrix.set(currentMatrix);//在沒有進(jìn)行移動(dòng)之前的位置基礎(chǔ)上進(jìn)行移動(dòng)
//實(shí)現(xiàn)位置的移動(dòng)
matrix.postTranslate(dx, dy);
break;
case MotionEvent.ACTION_UP://手指離開屏幕
break;
case MotionEvent.ACTION_POINTER_1_UP://當(dāng)屏幕上已經(jīng)有手指離開屏幕,屏幕上還有一個(gè)手指,就會觸發(fā)這個(gè)事件
break;
case MotionEvent.ACTION_POINTER_1_DOWN://當(dāng)屏幕上已經(jīng)有觸點(diǎn)(手指),再有一個(gè)手指按下屏幕,就會觸發(fā)這個(gè)事件
break;
default:
break;
}
//將imageView的矩陣位置改變
imageView.setImageMatrix(matrix);
return true;
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android優(yōu)化查詢加載大數(shù)量的本地相冊圖片
本文介紹了Android優(yōu)化查詢加載大數(shù)量的本地相冊圖片,可以方便的照片的查詢,,感興趣的小伙伴們可以參考一下。2016-10-10
Android中Retrofit 2.0直接使用JSON進(jìn)行數(shù)據(jù)交互
本篇文章主要介紹了Android中Retrofit 2.0直接使用JSON進(jìn)行數(shù)據(jù)交互,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
Android 使用PopupWindow實(shí)現(xiàn)彈出更多的菜單實(shí)例詳解
最近想要做一個(gè)彈出更多的菜單,而原生的彈出菜單卻不是我們想要的效果,所以必然要自定義菜單。接下來通過本文給大家介紹android 使用popupwindow實(shí)現(xiàn)彈出更多的菜單實(shí)例詳解,需要的朋友可以參考下2017-04-04
詳解Android應(yīng)用中使用TabHost組件進(jìn)行布局的基本方法
這篇文章主要介紹了Android應(yīng)用中使用TabHost組件進(jìn)行布局的基本方法,不繼承TabActivity并以最基本的布局文件方式進(jìn)行布局,需要的朋友可以參考下2016-04-04
Android SharedPreferences存儲的正確寫法
這篇文章主要介紹了Android SharedPreferences存儲的正確寫法的相關(guān)資料,需要的朋友可以參考下2017-06-06
Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果(四)
這篇文章主要為大家詳細(xì)介紹了Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android組件之DrawerLayout實(shí)現(xiàn)抽屜菜單
DrawerLayout組件同樣是V4包中的組件,也是直接繼承于ViewGroup類,所以這個(gè)類也是一個(gè)容器類。接下來通過本文給大家介紹Android組件之DrawerLayout實(shí)現(xiàn)抽屜菜單,感興趣的朋友一起學(xué)習(xí)吧2016-02-02
音量控制鍵控制的音頻流(setVolumeControlStream)描述
當(dāng)開發(fā)多媒體應(yīng)用或者游戲應(yīng)用的時(shí)候,需要使用音量控制鍵來設(shè)置程序的音量大小,在Android系統(tǒng)中有多種音頻流,感興趣的朋友可以了解下2013-01-01

