**:
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...