Android开发实现自定义水平滚动的容器示例
本文实例讲述了Android开发实现自定义水平滚动的容器。分享给大家供大家参考,具体如下:
publicclassHorizontalScrollViewextendsViewGroup{
//手势
privateGestureDetectormGestureDetector;
privateHorizontalScrollermScroller;
privateintcurID;
//快速滑动
privatebooleanisFlying;
//--回调函数-------------------------------------
privateOnChangeListenermListener;
publicvoidsetOnChangeListener(OnChangeListenerlistener){
if(listener!=null){
mListener=listener;
}
}
publicinterfaceOnChangeListener{
voidmove2dest(intcurID);
}
publicHorizontalScrollView(Contextcontext){
this(context,null);
}
publicHorizontalScrollView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicHorizontalScrollView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
mScroller=newHorizontalScroller();
isFlying=false;
initGesture(context);
}
@Override
protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){
//模向移动,
for(inti=0;igetChildCount()-1){
destID=getChildCount()-1;
}
if(mListener!=null){
mListener.move2dest(curID);
}
intdistance=(int)(destID*getWidth()-getScrollX());
//scrollBy(distance,0);
mScroller.startScroll(getScrollX(),getScrollY(),distance,0);
invalidate();
}
/**
*invalidate()此方法会触发下面的方法
*/
@Override
publicvoidcomputeScroll(){
//如果存在偏移,就不断刷新
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(),0);
invalidate();
}
super.computeScroll();
}
privatevoidinitGesture(Contextcontext){
mGestureDetector=newGestureDetector(context,newOnGestureListener(){
@Override
publicbooleanonSingleTapUp(MotionEvente){
returnfalse;
}
@Override
publicvoidonShowPress(MotionEvente){
}
@Override
publicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY){
scrollBy((int)distanceX,0);
returnfalse;
}
@Override
publicvoidonLongPress(MotionEvente){
}
@Override
/**
*快速滑动时
*/
publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){
isFlying=true;
if(curID>0&&velocityX>0){//表示向左移
move2dest(curID-1);
}elseif(curID
/**
*位移计算工具类
*
*@authorchenlin
*
*/
publicclassHorizontalScroller{
privateintstartX;
privateintstartY;
privateintdistanceX;
privateintdistanceY;
privateintcurrentX;
privateintcurrentY;
privatelongstartTime;
privatelongduration=1000L;
privatebooleanisFinish;
/**
*
*@paramscrollX
*x坐标
*@paramscrollY
*y坐标
*@paramdistanceX
*X方向移动的距离
*@paramdistanceY
*y方向移动的距离
*/
publicvoidstartScroll(intscrollX,intscrollY,intdistanceX,intdistanceY){
startX=scrollX;
startY=scrollY;
this.distanceX=distanceX;
this.distanceY=distanceY;
isFinish=false;
startTime=SystemClock.uptimeMillis();
}
/**
*计算偏移量,
*
*@returntrue还在移动false:移动已经停止
*/
publicbooleancomputeScrollOffset(){
if(isFinish){
returnfalse;
}
longtimePassed=SystemClock.uptimeMillis()-startTime;
if(timePassed=duration){
currentX=startX+distanceX;
currentY=startY+distanceY;
isFinish=true;
}
returntrue;
}
publicintgetCurrX(){
returncurrentX;
}
publicvoidsetCurrentX(intcurrentX){
this.currentX=currentX;
}
publicintgetCurrentY(){
returncurrentY;
}
publicvoidsetCurrentY(intcurrentY){
this.currentY=currentY;
}
}
使用方法
publicclassScrollActivityextendsActivityimplementsOnCheckedChangeListener,OnChangeListener{
privateint[]ids={R.drawable.a1,R.drawable.a2,R.drawable.a3,R.drawable.a4,R.drawable.a5,R.drawable.a6};
privateHorizontalScrollViewmView;
privateLinearLayoutmLayout;
privateRadioGroupmGroup;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myscrollview);
init();
}
privatevoidinit(){
mLayout=(LinearLayout)findViewById(R.id.body_layout);
mGroup=(RadioGroup)findViewById(R.id.radiogroup);
mView=newHorizontalScrollView(this);
for(inti=0;i
布局文件
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android基本组件用法总结》、《Android开发入门与进阶教程》、《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。