国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Android實現View滑動效果的6種方法

瀏覽:2日期:2022-09-20 08:03:33

本文實例為大家分享了Android實現View滑動效果的具體代碼,供大家參考,具體內容如下

一、View的滑動簡介

View的滑動是Android實現自定義控件的基礎,同時在開發中我們也難免會遇到View的滑動的處理。其實不管是那種滑動的方式基本思想都是類似的:當觸摸事件傳到View時,系統記下觸摸點的坐標,手指移動時系統記下移動后的觸摸的坐標并算出偏移量,并通過偏移量來修改View的坐標。

實現View滑動有很多種方法,這篇文章主要講解六種滑動的方法,分別是:layout()、offsetLeftAndRight()與offsetTopAndBottom()、LayoutParams、動畫、scollTo與scollBy和Scroller;在下一篇文章我們會詳細介紹屬性動畫。

二、實現View滑動的六種方法

2.1 layout()

view進行繪制的時候會調用onLayout()方法來設置顯示的位置,因此我們同樣也可以通過修改View的left、top、right、bottom這四種屬性來控制View的坐標。首先我們要自定義一個View,在onTouchEvent()方法中獲取觸摸點的坐標:

public boolean onTouchEvent(MotionEvent event) { //獲取到手指處的橫坐標和縱坐標 int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break;

接下來我們在ACTION_MOVE事件中計算偏移量,再調用layout()方法重新放置這個自定義View的位置就好了:

case MotionEvent.ACTION_MOVE: //計算移動的距離 int offsetX = x - lastX; int offsetY = y - lastY; //調用layout方法來重新放置它的位置 layout(getLeft()+offsetX, getTop()+offsetY, getRight()+offsetX , getBottom()+offsetY); break;

當我們每次移動時都會調用layout()方法來對自己重新布局,從而達到移動View的效果。

自定義View的全部代碼(CustomView.java):

package com.example.liuwangshu.moonviewslide;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class CustomView extends View { private int lastX; private int lastY; public CustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomView(Context context) { super(context); } public boolean onTouchEvent(MotionEvent event) { //獲取到手指處的橫坐標和縱坐標 int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //計算移動的距離 int offsetX = x - lastX; int offsetY = y - lastY; //調用layout方法來重新放置它的位置 layout(getLeft()+offsetX, getTop()+offsetY, getRight()+offsetX , getBottom()+offsetY); break; } return true; }}

布局中引用自定義View:

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' android:orientation='vertical'> <com.example.liuwangshu.moonviewslide.CustomView android: android:layout_width='80dp' android:layout_height='80dp' android:layout_margin='50dp' android:background='@android:color/holo_red_light' /></LinearLayout>

2.2 offsetLeftAndRight()與offsetTopAndBottom()

這兩種方法和layout()方法效果方法差不多,使用也差不多,我們將ACTION_MOVE中的代碼替換成如下代碼:

case MotionEvent.ACTION_MOVE: //計算移動的距離 int offsetX = x - lastX; int offsetY = y - lastY; //對left和right進行偏移 offsetLeftAndRight(offsetX); //對top和bottom進行偏移 offsetTopAndBottom(offsetY); break;

2.3 LayoutParams(改變布局參數)

LayoutParams主要保存了一個View的布局參數,因此我們可以通過LayoutParams來改變View的布局的參數從而達到了改變View的位置的效果。同樣的我們將ACTION_MOVE中的代碼替換成如下代碼:

LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) getLayoutParams(); layoutParams.leftMargin = getLeft() + offsetX; layoutParams.topMargin = getTop() + offsetY; setLayoutParams(layoutParams);

因為父控件是LinearLayout,所以我們用了LinearLayout.LayoutParams,如果父控件是RelativeLayout則要使用RelativeLayout.LayoutParams。除了使用布局的LayoutParams外,我們還可以用ViewGroup.MarginLayoutParams來實現:

ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();layoutParams.leftMargin = getLeft() + offsetX;layoutParams.topMargin = getTop() + offsetY;setLayoutParams(layoutParams);

2.4 動畫

可以采用View動畫來移動,在res目錄新建anim文件夾并創建translate.xml:

<?xml version='1.0' encoding='utf-8'?><set xmlns:android='http://schemas.android.com/apk/res/android'> <translate android:fromXDelta='0' android:toXDelta='300' android:duration='1000'/></set>

在Java代碼中引用:

mCustomView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.translate));

當然使用屬性動畫移動那就更簡單了,我們讓CustomView在1000毫秒內沿著X軸像右平移300像素:

ObjectAnimator.ofFloat(mCustomView,'translationX',0,300).setDuration(1000).start();

2.5 scollTo與scollBy

scollTo(x,y)表示移動到一個具體的坐標點,而scollBy(dx,dy)則表示移動的增量為dx、dy。其中scollBy最終也是要調用scollTo的。scollTo、scollBy移動的是View的內容,如果在ViewGroup中使用則是移動他所有的子View。我們將ACTION_MOVE中的代碼替換成如下代碼:

((View)getParent()).scrollBy(-offsetX,-offsetY);

這里要實現CustomView隨著我們手指移動的效果的話,我們就需要將偏移量設置為負值。

2.6 Scroller

我們用scollTo/scollBy方法來進行滑動時,這個過程是瞬間完成的,所以用戶體驗不大好。這里我們可以使用Scroller來實現有過度效果的滑動,這個過程不是瞬間完成的,而是在一定的時間間隔完成的。Scroller本身是不能實現View的滑動的,它需要配合View的computeScroll()方法才能彈性滑動的效果。在這里我們實現CustomView平滑的向右移動。

首先我們要初始化Scroller:

public CustomView(Context context, AttributeSet attrs) { super(context, attrs); mScroller = new Scroller(context); }

接下來重寫computeScroll()方法,系統會在繪制View的時候在draw()方法中調用該方法,這個方法中我們調用父類的scrollTo()方法并通過Scroller來不斷獲取當前的滾動值,每滑動一小段距離我們就調用invalidate()方法不斷的進行重繪,重繪就會調用computeScroll()方法,這樣我們就通過不斷的移動一個小的距離并連貫起來就實現了平滑移動的效果:

@Overridepublic void computeScroll() { super.computeScroll(); if(mScroller.computeScrollOffset()){ ((View) getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); //通過不斷的重繪不斷的調用computeScroll方法 invalidate(); } }

調用Scroller.startScroll()方法。我們在CustomView中寫一個smoothScrollTo()方法,調用Scroller.startScroll()方法,在2000毫秒內沿X軸平移delta像素:

public void smoothScrollTo(int destX,int destY){ int scrollX=getScrollX(); int delta=destX-scrollX; //1000秒內滑向destX mScroller.startScroll(scrollX,0,delta,0,2000); invalidate(); }

最后我們在ViewSlideActivity.java中調用CustomView的smoothScrollTo()方法

//使用Scroll來進行平滑移動mCustomView.smoothScrollTo(-400,0);

這里我們是設定CustomView沿著X軸向右平移400像素。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 欧美日韩亚洲综合久久久 | 成人黄页 | 日韩毛片免费线上观看 | 国产短裙黑色丝袜在线观看下 | 国产91网址| 亚洲精品视频免费在线观看 | 国产日本三级 | 亚洲成人7777| 国产一区亚洲二区三区毛片 | 九九线精品视频 | 久草手机视频在线 | 一区二区三区四区产品乱码伦 | 中国女人18xnxx视频 | 亚洲第一区精品日韩在线播放 | 日韩丝袜美腿 | 国产激情视频在线 | 国产第一页在线观看 | 国内精品久久久久影院免费 | 国产区一区二区三区 | 中文字幕在线观看一区二区 | 理论视频在线观看 | 伊人久久精品午夜 | 日本韩国三级在线 | 欧美成人精品一区二区三区 | 亚洲二三区 | 国产乱子伦露脸对白在线小说 | 亚洲一级成人 | 亚洲高清一区二区三区久久 | 国产午夜毛片一区二区三区 | 国产亚洲人成在线影院 | 成人欧美一级毛片免费观看 | 国产高清精品自在线看 | 九九久久免费视频 | 在线高清免费爱做网 | 丝袜黄色片 | 爽爽日本在线视频免费 | 亚洲国产精久久久久久久 | 日韩专区亚洲精品欧美专区 | 免费看一级欧美毛片 | 成人国产在线视频在线观看 | 乱人伦中文字幕视频 |