自定義viewgroup(4) 快速滑動

2021-07-25 12:16:19 字數 3750 閱讀 9255

**:

package com.example.libingyuan.horizontallistview.scrollviewgroup;

import android.content.context;

import android.util.attributeset;

import android.util.displaymetrics;

import android.view.motionevent;

import android.view.velocitytracker;

import android.view.view;

import android.view.viewconfiguration;

import android.view.viewgroup;

import android.view.windowmanager;

import android.widget.scroller;

/** * 自定義viewgroup

* 增加了加速度滑動

*/public

class

scrollviewgroup

extends

viewgroup

/*** 在xml檔案中使用的時候呼叫

**@param context 上下文

*@param attrs 屬性:如 android:layout_width="wrap_content"

*/public

scrollviewgroup(context context, attributeset attrs)

/*** 在xml檔案中呼叫,並且使用了自定義屬性的時候呼叫

**@param context 上下文

*@param attrs 屬性:如 android:layout_width="wrap_content"

*@param defstyleattr 自定義屬性的id

*/public

scrollviewgroup(context context, attributeset attrs, int defstyleattr)

/*** 初始化方法

* 初始化滾動輔助類scroller以及計算出螢幕寬度

**@param context 上下文

*/private

void

init(context context)

/*** 滾動時需要重寫的方法,用於控制滾動

*/@override

public

void

computescroll()

}/**

* 手指觸屏事件監聽

*/@override

public

boolean

ontouchevent(motionevent event)

//獲取現在的x座標

mlastmotionx = event.getx();

break;

//移動事件

case motionevent.action_move:

//測試器新增移動事件

if (mvelocitytracker != null)

//計算移動的偏移量

float delt = mlastmotionx - x;

//重置手指位置

mlastmotionx = x;

//滾動

scrollby((int) delt, 0);

break;

//手指抬起事件

case motionevent.action_up:

//測試器新增抬起事件

mvelocitytracker.addmovement(event);

//新增加速度的測試時間,這裡是測量1000毫秒內的加速度

mvelocitytracker.computecurrentvelocity(1000, mmaximumvelocity);

//獲取x方向加速度

float pxsec = mvelocitytracker.getxvelocity();

//得到最後乙個子view

view lastchild = getchildat(getchildcount() - 1);

//獲取滑動的最大滑動距離(最後乙個child的右邊框的座標減去螢幕的寬度)

int finalychild = (int) (lastchild.getx() + lastchild.getwidth() - screenwidth);

//如果x的加速度大於系統設定的最小移動距離,就可以慣性滑動

if (math.abs(pxsec) > mminimumvelocity)

mscroller.fling(getscrollx(), 0, (int) -pxsec, 0, 0, finalychild, 0, 0);

//如果滑動的距離小於第乙個控制項的最左邊(0)則回彈至(0,0)點

if (getscrollx() < 0)

//如果滑動的距離大於最大可滑動距離則滑動到最後乙個子view

if (getscrollx() >= finalychild)

scrollto(finalychild, 0);

//重新整理介面

invalidate();

//清空測試器

recyclevelocitytracker();

break;

default:

break;

}return

true;

}/**

* 建立或復用加速度測試器

*/private

void

initorresetvelocitytracker() else

}/**

* **加速度測試器,防止記憶體洩漏

*/private

void

recyclevelocitytracker()

}@override

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec)

/*** 測量寬度

*/private

intmeasurewidth(int widthmeasurespec, int heightmeasurespec)

return modewidth == measurespec.exactly ? sizewidth : width;

}/**

* 測量高度

*/private

intmeasureheight(int widthmeasurespec, int heightmeasurespec)

height = height / childcount;

return modeheight == measurespec.exactly ? sizeheight : height;

}/**

* 給子布局設定位置

*/@override

protected

void

onlayout(boolean changed, int l, int t, int r, int b)

}@override

public layoutparams generatelayoutparams(attributeset attrs)

}

自定義ViewGroup(一)

1 概述 viewgroup是乙個view的容器,他可以給出childview的測量模式和測量其寬高,他的作用非常重要。childview測量模式 exactly 表示設定了精確的值,一般當childview設定其寬 高為精確值 match parent時,viewgroup會將其設定為exactl...

ViewGroup 自定義控制項

自定義viewgroup這篇文章是針對自定義layoutmanager來寫的,提取出相關自定義的相同點。所有的自定義都可以歸結為在父控制項裡面放置子控制項。一 繼承類 viewgroup 繼承之後需要實現構造,由於一般是在xml中引入所有需要實現以下構造 viewgroup context cont...

自定義ViewGroup 回顧

自定viewgroup要比自定義view要複雜一點,因為自定義viewgroup不僅測量自身還要測量子元素和及重寫onlayout 來一次排列子view。下面這篇文章是關於自定義viewgroup的一些基本知識,這些主要內容來自 android開發藝術探索 在文章最後又這本書的網上版本。viewgr...