這篇文章給大家介紹Android手勢(shì)識(shí)別ViewFlipper觸摸動(dòng)畫(huà)的示例分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
十年的大同網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整大同建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“大同網(wǎng)站設(shè)計(jì)”,“大同網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
我們?cè)榻B過(guò)“在Android開(kāi)發(fā)中使用Gallery實(shí)現(xiàn)'多級(jí)聯(lián)動(dòng)'”和“在Android中實(shí)現(xiàn)service動(dòng)態(tài)更新UI界面”。今天給大家介紹一下如何實(shí)現(xiàn)Android主頁(yè)面的左右拖動(dòng)效果。實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,就是使用ViewFlipper來(lái)將您要來(lái)回拖動(dòng)的View裝在一起,然后與GestureDetector手勢(shì)識(shí)別類(lèi)來(lái)聯(lián)動(dòng),確定要顯示哪個(gè)View,加上一點(diǎn)點(diǎn)動(dòng)畫(huà)效果即可。比如當(dāng)手指向左快速滑動(dòng)時(shí)跳轉(zhuǎn)到上一個(gè)View,手指向右快速滑動(dòng)時(shí)跳轉(zhuǎn)到下一個(gè)View,本例中使用圖片作為各個(gè)View的頁(yè)面,實(shí)現(xiàn)左右快速滑動(dòng)顯示不同的圖片。
Android View
首先來(lái)看看我們的layout,如下所示:
如上所示,在ViewFlipper中放置多個(gè)layout(接下來(lái)會(huì)在不同的layout中來(lái)回滑動(dòng)),ViewFlipper在同一個(gè)頁(yè)面就顯示其中一個(gè)layout。
ViewFlipper中的四個(gè)layout很簡(jiǎn)單,我們就放置一張圖片,如下所示:
接下來(lái)我們來(lái)看看Activity,我們的Activity需要實(shí)現(xiàn)兩個(gè)接口OnGestureListener,OnTouchListener。具體的代碼如下所示,代碼中都有相應(yīng)的注釋?zhuān)@里就不再詳述。
package com.ideasandroid.demo; import android.app.Activity; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.GestureDetector.OnGestureListener; import android.view.View.OnTouchListener; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.ViewFlipper; public class ViewFlipperDemo extends Activity implementsOnGestureListener,OnTouchListener{ private ViewFlipper mFlipper; GestureDetector mGestureDetector; private int mCurrentLayoutState; private static final int FLING_MIN_DISTANCE = 100; private static final int FLING_MIN_VELOCITY = 200; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mFlipper = (ViewFlipper) findViewById(R.id.flipper); //注冊(cè)一個(gè)用于手勢(shì)識(shí)別的類(lèi) mGestureDetector = new GestureDetector(this); //給mFlipper設(shè)置一個(gè)listener mFlipper.setOnTouchListener(this); mCurrentLayoutState = 0; //允許長(zhǎng)按住ViewFlipper,這樣才能識(shí)別拖動(dòng)等手勢(shì) mFlipper.setLongClickable(true); } /** * 此方法在本例中未用到,可以指定跳轉(zhuǎn)到某個(gè)頁(yè)面 * @param switchTo */ public void switchLayoutStateTo(int switchTo) { while (mCurrentLayoutState != switchTo) { if (mCurrentLayoutState > switchTo) { mCurrentLayoutState--; mFlipper.setInAnimation(inFromLeftAnimation()); mFlipper.setOutAnimation(outToRightAnimation()); mFlipper.showPrevious(); } else { mCurrentLayoutState++; mFlipper.setInAnimation(inFromRightAnimation()); mFlipper.setOutAnimation(outToLeftAnimation()); mFlipper.showNext(); } } ; } /** * 定義從右側(cè)進(jìn)入的動(dòng)畫(huà)效果 * @return */ protected Animation inFromRightAnimation() { Animation inFromRight = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); inFromRight.setDuration(500); inFromRight.setInterpolator(new AccelerateInterpolator()); return inFromRight; } /** * 定義從左側(cè)退出的動(dòng)畫(huà)效果 * @return */ protected Animation outToLeftAnimation() { Animation outtoLeft = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); outtoLeft.setDuration(500); outtoLeft.setInterpolator(new AccelerateInterpolator()); return outtoLeft; } /** * 定義從左側(cè)進(jìn)入的動(dòng)畫(huà)效果 * @return */ protected Animation inFromLeftAnimation() { Animation inFromLeft = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); inFromLeft.setDuration(500); inFromLeft.setInterpolator(new AccelerateInterpolator()); return inFromLeft; } /** * 定義從右側(cè)退出時(shí)的動(dòng)畫(huà)效果 * @return */ protected Animation outToRightAnimation() { Animation outtoRight = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); outtoRight.setDuration(500); outtoRight.setInterpolator(new AccelerateInterpolator()); return outtoRight; } public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } /* * 用戶(hù)按下觸摸屏、快速移動(dòng)后松開(kāi)即觸發(fā)這個(gè)事件 * e1:第1個(gè)ACTION_DOWN MotionEvent * e2:最后一個(gè)ACTION_MOVE MotionEvent * velocityX:X軸上的移動(dòng)速度,像素/秒 * velocityY:Y軸上的移動(dòng)速度,像素/秒 * 觸發(fā)條件 : * X軸的坐標(biāo)位移大于FLING_MIN_DISTANCE,且移動(dòng)速度大于FLING_MIN_VELOCITY個(gè)像素/秒 */ public boolean onFling(MotionEvent e1, MotionEvent e2, floatvelocityX, float velocityY) { if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) { // 當(dāng)像左側(cè)滑動(dòng)的時(shí)候 //設(shè)置View進(jìn)入屏幕時(shí)候使用的動(dòng)畫(huà) mFlipper.setInAnimation(inFromRightAnimation()); //設(shè)置View退出屏幕時(shí)候使用的動(dòng)畫(huà) mFlipper.setOutAnimation(outToLeftAnimation()); mFlipper.showNext(); } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) { // 當(dāng)像右側(cè)滑動(dòng)的時(shí)候 mFlipper.setInAnimation(inFromLeftAnimation()); mFlipper.setOutAnimation(outToRightAnimation()); mFlipper.showPrevious(); } return false; } public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } public boolean onScroll(MotionEvent e1, MotionEvent e2, floatdistanceX, float distanceY) { return false; } public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } public boolean onTouch(View v, MotionEvent event) { // 一定要將觸屏事件交給手勢(shì)識(shí)別類(lèi)去處理(自己處理會(huì)很麻煩的) return mGestureDetector.onTouchEvent(event); } }
關(guān)于Android手勢(shì)識(shí)別ViewFlipper觸摸動(dòng)畫(huà)的示例分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。