最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年03月31日 15:48:04   作者:Big Skipper  
這篇文章主要介紹了Android實(shí)現(xiàn)View滑動(dòng)的6種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

一、View的滑動(dòng)簡(jiǎn)介

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

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

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

2.1 layout()

view進(jìn)行繪制的時(shí)候會(huì)調(diào)用onLayout()方法來(lái)設(shè)置顯示的位置,因此我們同樣也可以通過(guò)修改View的left、top、right、bottom這四種屬性來(lái)控制View的坐標(biāo)。首先我們要自定義一個(gè)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;

接下來(lái)我們?cè)贏CTION_MOVE事件中計(jì)算偏移量,再調(diào)用layout()方法重新放置這個(gè)自定義View的位置就好了:

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

當(dāng)我們每次移動(dòng)時(shí)都會(huì)調(diào)用layout()方法來(lái)對(duì)自己重新布局,從而達(dá)到移動(dòng)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:
  //計(jì)算移動(dòng)的距離
  int offsetX = x - lastX;
  int offsetY = y - lastY;
  //調(diào)用layout方法來(lái)重新放置它的位置
  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:id="@+id/customview"
 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:
 //計(jì)算移動(dòng)的距離
 int offsetX = x - lastX;
 int offsetY = y - lastY;
 //對(duì)left和right進(jìn)行偏移
 offsetLeftAndRight(offsetX);
 //對(duì)top和bottom進(jìn)行偏移
 offsetTopAndBottom(offsetY);
 break;

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

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

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

因?yàn)楦缚丶荓inearLayout,所以我們用了LinearLayout.LayoutParams,如果父控件是RelativeLayout則要使用RelativeLayout.LayoutParams。除了使用布局的LayoutParams外,我們還可以用ViewGroup.MarginLayoutParams來(lái)實(shí)現(xiàn):

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

2.4 動(dòng)畫(huà)

可以采用View動(dòng)畫(huà)來(lái)移動(dòng),在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)然使用屬性動(dòng)畫(huà)移動(dòng)那就更簡(jiǎn)單了,我們讓CustomView在1000毫秒內(nèi)沿著X軸像右平移300像素:

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

2.5 scollTo與scollBy

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

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

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

2.6 Scroller

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

首先我們要初始化Scroller:

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

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

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

調(diào)用Scroller.startScroll()方法。我們?cè)贑ustomView中寫(xiě)一個(gè)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();
 }

最后我們?cè)赩iewSlideActivity.java中調(diào)用CustomView的smoothScrollTo()方法

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 二維碼 生成和識(shí)別二維碼 附源碼下載

    Android 二維碼 生成和識(shí)別二維碼 附源碼下載

    這篇文章主要介紹了Android 生成和識(shí)別二維碼的方法,提供源碼下載,需要的朋友可以參考下。
    2016-06-06
  • Android打造炫酷進(jìn)度條效果

    Android打造炫酷進(jìn)度條效果

    這篇文章主要為大家詳細(xì)介紹了Android打造炫酷進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • android編程實(shí)現(xiàn)類(lèi)似于支付寶余額快速閃動(dòng)效果的方法

    android編程實(shí)現(xiàn)類(lèi)似于支付寶余額快速閃動(dòng)效果的方法

    這篇文章主要介紹了android編程實(shí)現(xiàn)類(lèi)似于支付寶余額快速閃動(dòng)效果的方法,涉及Android時(shí)間函數(shù)的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Android開(kāi)發(fā)手冊(cè)Button按鈕實(shí)現(xiàn)點(diǎn)擊音效

    Android開(kāi)發(fā)手冊(cè)Button按鈕實(shí)現(xiàn)點(diǎn)擊音效

    這篇文章主要為大家介紹了Android開(kāi)發(fā)手冊(cè)Button按鈕實(shí)現(xiàn)點(diǎn)擊音效示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 使用Java代碼在Android中實(shí)現(xiàn)圖片裁剪功能

    使用Java代碼在Android中實(shí)現(xiàn)圖片裁剪功能

    這篇文章主要介紹了使用Java代碼在Android中實(shí)現(xiàn)圖片裁剪功能,許多應(yīng)用都需要此類(lèi)從相冊(cè)中選取圖片然后編輯的功能,需要的朋友可以參考下
    2015-07-07
  • android原生JSON解析實(shí)例

    android原生JSON解析實(shí)例

    通過(guò)實(shí)例給大家詳細(xì)分析一下關(guān)于android開(kāi)發(fā)原生JSON解析的問(wèn)題。
    2017-11-11
  • Android中volley封裝實(shí)踐記錄

    Android中volley封裝實(shí)踐記錄

    這篇文章主要給大家介紹了關(guān)于Android中volley封裝實(shí)踐的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Android基于ViewPager+Fragment實(shí)現(xiàn)左右滑屏效果的方法

    Android基于ViewPager+Fragment實(shí)現(xiàn)左右滑屏效果的方法

    這篇文章主要介紹了Android基于ViewPager+Fragment實(shí)現(xiàn)左右滑屏效果的方法,結(jié)合實(shí)例形式分析了Android實(shí)現(xiàn)滑屏效果的布局與滑動(dòng)功能相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • 揭秘Android視圖繪制的流程步驟

    揭秘Android視圖繪制的流程步驟

    在Android的UI中,View是至關(guān)重要的一個(gè)組件,它是用戶(hù)界面的基本構(gòu)建塊,在View的繪制過(guò)程中,涉及到很多重要的概念和技術(shù),本文將詳細(xì)介紹Android?View的繪制過(guò)程,讓你能夠更好地理解和掌握Android的UI開(kāi)發(fā),需要的朋友可以參考下
    2023-06-06
  • 阿里路由框架ARouter 源碼解析之Compiler

    阿里路由框架ARouter 源碼解析之Compiler

    這篇文章主要介紹了阿里路由框架ARouter 源碼解析之Compiler,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論

三台县| 泰和县| 新建县| 清镇市| 千阳县| 兴仁县| 淳化县| 察隅县| 潞西市| 荣昌县| 儋州市| 洛阳市| 湖口县| 浮梁县| 嘉义市| 澄迈县| 福州市| 台前县| 山阴县| 汉源县| 遂昌县| 尼木县| 进贤县| 澄城县| 临沭县| 灵武市| 靖宇县| 营山县| 巴彦淖尔市| 偏关县| 玛沁县| 石狮市| 灵寿县| 南丰县| 肃宁县| 绥江县| 房山区| 福鼎市| 云浮市| 潼关县| 新竹县|