Android實現(xiàn)多點觸摸操作
Android中的多點觸摸可以實現(xiàn)圖片的放大、縮小和旋轉(zhuǎn)等處理,供大家參考,具體內(nèi)容如下
主要通過setOnTouchListener方法來監(jiān)聽用戶的觸摸事件,通過event.getX(0)和 event.getX(1)來獲取第一個觸控點和第二個觸控點的x軸(或者y軸)坐標,接下來在MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE、MotionEvent.ACTION_UP這幾種情況中來對獲取到的x軸或者y軸進行處理,就能實現(xiàn)我們想要的效果了。
下面這個小Demo實現(xiàn)了對圖片的放大和縮小處理:
package com.example.administrator.translation; ? import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; ? ? public class MainActivity extends ActionBarActivity { ? ? ? private RelativeLayout layout; ? ? private ImageView iv; ? ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? setContentView(R.layout.activity_main); ? ? ? ? ? layout = (RelativeLayout) findViewById(R.id.layout); ? ? ? ? iv = (ImageView) findViewById(R.id.iv); ? ? ? ? ? ? layout.setOnTouchListener(new View.OnTouchListener() { ? ? ? ? ? ? ? float currentDistance; ? ? ? ? ? ? float lastDistance = -1; ? ? ? ? ? ? ? @Override ? ? ? ? ? ? public boolean onTouch(View v, MotionEvent event) { ? ? ? ? ? ? ? ? switch (event.getAction()) { ? ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_DOWN: ? ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_MOVE: ? ? ? ? ? ? ? ? ? ? ? ? //判斷幾個觸控點 ? ? ? ? ? ? ? ? ? ? ? ? if (event.getPointerCount() >= 2) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? //兩點之間x的坐標差 ? ? ? ? ? ? ? ? ? ? ? ? ? ? float offsetX = event.getX(0) - event.getX(1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? //兩點之間y的坐標差 ? ? ? ? ? ? ? ? ? ? ? ? ? ? float offsetY = event.getY(0) - event.getY(1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? //兩點之間的距離 ? ? ? ? ? ? ? ? ? ? ? ? ? ? currentDistance = (float) Math.sqrt(offsetX * offsetX + offsetY * offsetY); ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (lastDistance < 0) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //沒有縮放 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lastDistance = currentDistance; ? ? ? ? ? ? ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (currentDistance - lastDistance > 5) {//放大 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) iv.getLayoutParams(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lp.width = (int) (1.1f * iv.getWidth()); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lp.height = (int) (1.1f * iv.getHeight()); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? iv.setLayoutParams(lp); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lastDistance = currentDistance; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } else if (currentDistance - lastDistance < -5) {//縮小 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int currentIvWidth = iv.getWidth(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int currentIvHeight = iv.getHeight(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (currentIvWidth > 50 && currentIvHeight >50) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) iv.getLayoutParams(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lp.width = (int) (0.9f * iv.getWidth()); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lp.height = (int) (0.9f * iv.getHeight()); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? iv.setLayoutParams(lp); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lastDistance = currentDistance; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_UP: ? ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? } ? ? ? ? @Override ? ? public boolean onCreateOptionsMenu(Menu menu) { ? ? ? ? // Inflate the menu; this adds items to the action bar if it is present. ? ? ? ? getMenuInflater().inflate(R.menu.menu_main, menu); ? ? ? ? return true; ? ? } ? ? ? @Override ? ? public boolean onOptionsItemSelected(MenuItem item) { ? ? ? ? // Handle action bar item clicks here. The action bar will ? ? ? ? // automatically handle clicks on the Home/Up button, so long ? ? ? ? // as you specify a parent activity in AndroidManifest.xml. ? ? ? ? int id = item.getItemId(); ? ? ? ? ? //noinspection SimplifiableIfStatement ? ? ? ? if (id == R.id.action_settings) { ? ? ? ? ? ? return true; ? ? ? ? } ? ? ? ? ? return super.onOptionsItemSelected(item); ? ? } }
xml代碼:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:id="@+id/layout" ? ? xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" ? ? android:layout_height="match_parent" tools:context=".MainActivity"> ? ? ? <ImageView ? ? ? ? android:id="@+id/iv" ? ? ? ? android:layout_width="wrap_content" ? ? ? ? android:src="@mipmap/a" ? ? ? ? android:layout_height="wrap_content" /> ? </RelativeLayout>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Android開發(fā)支持表情的實現(xiàn)詳解
本篇文章是對在Android開發(fā)中支持表情的實現(xiàn)代碼進行了介紹。需要的朋友參考下2013-05-05Android中Service和Activity相互通信示例代碼
在android中Activity負責(zé)前臺界面展示,service負責(zé)后臺的需要長期運行的任務(wù)。下面這篇文章主要給大家介紹了關(guān)于Android中Service和Activity相互通信的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09Android開發(fā)手冊TextInputLayout樣式使用示例
這篇文章主要為大家介紹了Android開發(fā)手冊TextInputLayout樣式使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06