日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android實(shí)現(xiàn)View滑動效果的6種方法

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

本文實(shí)例為大家分享了Android實(shí)現(xiàn)View滑動效果的具體代碼,供大家參考,具體內(nèi)容如下

一、View的滑動簡介

View的滑動是Android實(shí)現(xiàn)自定義控件的基礎(chǔ),同時在開發(fā)中我們也難免會遇到View的滑動的處理。其實(shí)不管是那種滑動的方式基本思想都是類似的:當(dāng)觸摸事件傳到View時,系統(tǒng)記下觸摸點(diǎn)的坐標(biāo),手指移動時系統(tǒng)記下移動后的觸摸的坐標(biāo)并算出偏移量,并通過偏移量來修改View的坐標(biāo)。

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

二、實(shí)現(xiàn)View滑動的六種方法

2.1 layout()

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

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

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

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

當(dāng)我們每次移動時都會調(diào)用layout()方法來對自己重新布局,從而達(dá)到移動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) { //獲取到手指處的橫坐標(biāo)和縱坐標(biāo) 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; //調(diào)用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進(jìn)行偏移 offsetLeftAndRight(offsetX); //對top和bottom進(jìn)行偏移 offsetTopAndBottom(offsetY); break;

2.3 LayoutParams(改變布局參數(shù))

LayoutParams主要保存了一個View的布局參數(shù),因此我們可以通過LayoutParams來改變View的布局的參數(shù)從而達(dá)到了改變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來實(shí)現(xiàn):

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

2.4 動畫

可以采用View動畫來移動,在res目錄新建anim文件夾并創(chuàng)建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));

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

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

2.5 scollTo與scollBy

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

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

這里要實(shí)現(xiàn)CustomView隨著我們手指移動的效果的話,我們就需要將偏移量設(shè)置為負(fù)值。

2.6 Scroller

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

首先我們要初始化Scroller:

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

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

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

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
偷拍欧美精品| 日韩精品免费视频一区二区三区 | 亚洲精品永久免费视频| 国产精品jk白丝蜜臀av小说| 国产日韩欧美一区二区三区在线观看| 亚洲先锋成人| 免费观看不卡av| 欧美日韩精品免费观看视频完整| 亚洲激情精品| 欧美偷窥清纯综合图区| 精品国产中文字幕第一页| 国产一区精品福利| 欧美激情麻豆| 色综合五月天| 97成人在线| 吉吉日韩欧美| 国产伦精品一区二区三区视频| 国产精品视区| 欧美在线日韩| 啪啪亚洲精品| 极品日韩av| 青青草国产成人99久久| 国产女人18毛片水真多18精品| 亚洲免费中文| 鲁大师精品99久久久| 久久最新视频| 日本欧美不卡| 一区在线免费观看| 欧美另类专区| av一区二区高清| 欧美亚洲国产日韩| 日韩在线看片| 日韩精品视频在线看| 日本久久成人网| 久久在线91| 综合激情五月婷婷| 日韩欧美1区| 综合一区av| 欧美aaaaaa午夜精品| 黑丝美女一区二区| 中文字幕一区久| 免费在线观看一区| 狠狠操综合网| 国产视频久久| 91精品久久久久久久久久不卡| 亚洲丝袜美腿一区| 红桃视频国产一区| 五月亚洲婷婷| 日欧美一区二区| 精品一区二区三区中文字幕| 久久www成人_看片免费不卡| 好吊一区二区三区| 国产精品中文字幕亚洲欧美| 日韩电影二区| 国产精品久久久免费| 国产亚洲一区在线| 久久香蕉国产| 欧美sss在线视频| 日本不卡中文字幕| 国产盗摄——sm在线视频| 精品久久久久中文字幕小说| 精品一区视频| 精品国产美女a久久9999| 国产欧美日韩一区二区三区在线| 在线午夜精品| 视频一区视频二区在线观看| 中文av在线全新| 欧洲精品一区二区三区| 日本在线高清| 私拍精品福利视频在线一区| 久久久影院免费| 丝袜脚交一区二区| 日韩和欧美的一区| 国产福利一区二区精品秒拍| 另类欧美日韩国产在线| 精品美女在线视频| 波多视频一区| 视频一区免费在线观看| 欧美一区=区三区| 国产一区福利| 亚洲免费观看| 中文字幕一区二区三区在线视频| 亚洲精品福利| 国产一区二区三区黄网站| 日韩中文视频| 日本亚州欧洲精品不卡| 精品视频久久| 免播放器亚洲| 精品国产三区在线| 亚洲一区国产一区| 精品视频黄色| 日韩精品一二区| 另类欧美日韩国产在线| 91九色精品| 久久精品国产在热久久| 在线亚洲自拍| 欧美国产日韩电影| 伊人精品在线| 成人精品国产亚洲| 中文字幕视频精品一区二区三区| 国产一区调教| 亚州国产精品| 欧美成人日韩| 美日韩一区二区三区| 欧洲激情综合| 国产一区二区三区91| 日韩精品一二三| 欧美 日韩 国产一区二区在线视频| 欧美久久一区二区三区| 日韩视频二区| 欧美日韩色图| 国产精品久久久久久久久久白浆| 免费不卡中文字幕在线| 精品欧美日韩精品| 国产视频网站一区二区三区| 尤物在线精品| 欧美一区二区三区激情视频| 精品久久美女| 国产麻豆精品久久| 国产免费播放一区二区| 日韩不卡在线观看日韩不卡视频| 国产综合精品一区| 国产美女高潮在线| 91一区二区三区四区| 国产91在线播放精品| 欧美激情国产在线| 国产精品久久久一区二区| 97精品资源在线观看| 日本不卡视频在线观看| 亚洲+小说+欧美+激情+另类| 亚洲午夜国产成人| 午夜性色一区二区三区免费视频| 奶水喷射视频一区| 美美哒免费高清在线观看视频一区二区| 2023国产精品久久久精品双| 一区二区视频欧美| 日韩中文字幕视频网| 国产私拍福利精品视频二区| 国产精品videossex久久发布 | 国产精品一区二区三区av| 日韩av资源网| 麻豆91精品视频| 欧美成a人免费观看久久| 国产精品日韩| 日本成人中文字幕在线视频| 国产精品嫩草影院在线看| 精品国产亚洲日本| 久久国产精品久久久久久电车 | 日本午夜精品久久久久| 青草av.久久免费一区| 国产va在线视频| 亚洲少妇自拍| 麻豆国产精品视频| 久久久久久久久丰满| 亚洲最大av| 福利精品在线| 久久亚洲风情| 日本久久黄色| 最新国产精品视频| 色黄视频在线观看| 日韩手机在线| 欧美日韩亚洲在线观看| 日韩av在线免费观看不卡| 日本蜜桃在线观看视频| 国产农村妇女精品一区二区| 国产麻豆一区| 免费在线观看日韩欧美| 日本不良网站在线观看| 日韩av网站在线观看| 久久精品国产大片免费观看| 久久av网站| 亚洲精品看片| 亚洲午夜91| 国产精品115| 蜜臀久久99精品久久久久久9| 成人综合一区| 国产精品自在| 中文字幕视频精品一区二区三区 | 免费精品视频| 亚洲女同中文字幕| 日本高清不卡一区二区三区视频 | 激情婷婷欧美| 亚洲天堂资源| 国产精品香蕉| 日韩国产一二三区| 中文字幕日韩高清在线 | 国产精品久久观看| 国产精品久av福利在线观看| 老牛影视一区二区三区| 久久精品亚洲人成影院| 国产精品一线天粉嫩av| 日韩在线观看中文字幕| 亚洲欧美激情诱惑| 国产日韩欧美一区二区三区| 亚洲毛片在线免费| 免费不卡在线观看| 综合精品一区| 国产精品一区二区免费福利视频| 日韩黄色av| 精品国产欧美日韩|