歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中實現view可以滑動的六種方法

在Android開發中,經常會遇到一個view需要它能夠支持滑動的需求。今天就來總結實現其滑動的六種方法。其實每一種方法的思路都是一樣的,即:監聽手勢觸摸的坐標來實現view坐標的變化,從而實現view的滑動效果。

一、通過Layout方法來實現滑動

如果你將滑動後的目標位置的坐標傳遞給Layout,這樣子就會把view的位置給重新布置了一下,在視覺上就是view的一個滑動的效果。

這就是利用Layout方法實現滑動的核心思路。我們來看一下代碼:

新建項目,然後自定義一個view,代碼如下:

package com.example.testdragview;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class DragView extends View{
   
   
    private int lastX;
    private int lastY;
   

    public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public DragView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DragView(Context context) {
        super(context);
    }

   
   
    public boolean onTouchEvent(MotionEvent event) {
       
//        Log.d("付勇焜----->","TouchEvent");
//        Log.d("付勇焜----->",super.onTouchEvent(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 offX = x - lastX;
            int offY = y - lastY;
            //調用layout方法來重新放置它的位置
            layout(getLeft()+offX, getTop()+offY,
                    getRight()+offX    , getBottom()+offY);
       
            break;
        }
       
        return true;
    }
}

核心代碼就是onTouchEvent方法了。代碼很簡單,無非就是記錄手指的上次坐標與下次坐標,然後將前後移動的增量傳遞給layout方法而已。

值得注意的是,onTouchEvent的返回值為true,表示我們要成功消化掉這個觸摸事件。

然後再修改activity_main.xml的代碼,將這個view裝到布局裡,如下:

<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"
    >

    <com.example.testdragview.DragView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#FF0000" />

</LinearLayout>

現在來運行程序。效果如下:

效果還可以吧。可以自由的滑動了。

其實上面我們用getX()和getY()獲得的是在視圖坐標系中的值。其實我們也可以使用絕對坐標,即使用getRawX()和getRawY()獲得的值

來實現這個滑動效果。修改DragView中的onTouchEvent中的代碼,如下所示:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2     xmlns:tools="http://schemas.android.com/tools"
3     android:layout_width="match_parent"
4     android:layout_height="match_parent"
5    >
6
7    <com.example.testdragview.DragView
8         android:layout_width="100dp"
9         android:layout_height="100dp"
10         android:background="#FF0000" />
11
12 </LinearLayout>

一定注意,此時不同的是,在move過程中,我們要及時改變lastX,與lastY的值來獲取正確的之前坐標(因為是在Android坐標系嘛,用的是絕對距離)。

此時再次運行程序,效果跟上圖一樣。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-11/125390p2.htm

Copyright © Linux教程網 All Rights Reserved