android UI效果三: 滚动切换屏幕

来源:互联网 发布:小米5如何备份数据 编辑:程序博客网 时间:2024/06/05 23:44

效果如下:

主要有3个类1个layout:

Activity: ScrollViewTestActivity, 两个自定义View, 1个 ScrollView用来控制滑动效果, 1个PageControlView,用来控制下方显示的处在第几屏.

1个mian.xml

 

Activity:

?
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.ImageView;
  
publicclass ScrollViewTestActivity extendsActivity {
    /** Called when the activity is first created. */
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ScrollView sv = (ScrollView)findViewById(R.id.scroll);
        ImageView iv =new ImageView(this);
        iv.setImageDrawable(this.getResources().getDrawable(R.drawable.a1));
        sv.addView(iv);
        sv.addView(View.inflate(this, R.layout.layout_0,null));
        ImageView iv2 =new ImageView(this);
        iv2.setImageDrawable(getResources().getDrawable(R.drawable.a2));
        sv.addView(iv2);
          
        PageControlView pageControl = (PageControlView)findViewById(R.id.pageControl);
        sv.setOnScreenChangeListener(pageControl);
          
        sv.initPageControlView();
    }
}

 ScrollView:

?
importandroid.content.Context;
importandroid.util.AttributeSet;
importandroid.view.GestureDetector;
importandroid.view.GestureDetector.SimpleOnGestureListener;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.ViewConfiguration;
importandroid.view.ViewGroup;
importandroid.widget.Scroller;
  
publicclass ScrollView extendsViewGroup{
  
    privateGestureDetector gesture;
    privateContext context;
    privateboolean fling;
    privateScroller scroller;
    privateOnScreenChangeListener onScreenChangeListener;
      
    publicScrollView(Context context) {
        super(context);
        this.context = context;
        gesture =new GestureDetector(context,newGestureListener());
        scroller =new Scroller(context);
    }
  
    publicScrollView(Context context,AttributeSet att){
        super(context,att);
        this.context = context;
        gesture =new GestureDetector(context,newGestureListener());
        scroller =new Scroller(context);
    }
      
    @Override
    protectedvoid onLayout(booleanchanged, intl, intt, intr, intb) {
        for(inti=0;i<getChildCount();i++){
            View child  = (View)getChildAt(i);
            child.measure(r-l, b-t);
            child.layout(getWidth()*i,0, getWidth()*(i+1), getHeight());
        }
    }
      
    @Override
    publicboolean onTouchEvent(MotionEvent ev){
        gesture.onTouchEvent(ev);
        switch(ev.getAction()){
        caseMotionEvent.ACTION_MOVE:
            break;
        caseMotionEvent.ACTION_UP:
            System.out.println("action_up...");
            if(!fling){
                scrollToScreen();
            }
            fling =false;
            break;
        }
        returntrue;
    }
      
    /**
     * 用来计算拖动一段距离后,要显示哪个界面
     */
    privatevoid scrollToScreen(){
        intleftWidth = getScrollX();
        inttabs = leftWidth/getWidth();
        intlen = leftWidth - tabs*getWidth();
        if(len<getWidth()/2){
//          scrollTo(tabs*getWidth(),0);
            scroller.startScroll(leftWidth,0, -len,0, len*2);
        }else{
//          scrollTo((tabs+1)*getWidth(),0);
            scroller.startScroll(leftWidth,0, getWidth()-len,0, len*2);
            tabs = tabs +1;
        }
        if(onScreenChangeListener!=null){
            onScreenChangeListener.screenChange(tabs, getChildCount());
        }
        invalidate();
    }
      
    @Override  
    publicvoid computeScroll() {  
        if(scroller.computeScrollOffset()) {  
            scrollTo(scroller.getCurrX(),0);  
            postInvalidate();  
        }  
    }
  
    classGestureListener extendsSimpleOnGestureListener{  
    
        @Override  
        publicboolean onDoubleTap(MotionEvent e){  
            returnsuper.onDoubleTap(e);  
        }  
    
        @Override  
        publicboolean onDown(MotionEvent e){  
            returnsuper.onDown(e);  
        }  
    
        @Override  
        publicboolean onFling(MotionEvent e1, MotionEvent e2, floatvelocityX,floatvelocityY){  
            if(Math.abs(velocityX)>ViewConfiguration.get(context).getScaledMinimumFlingVelocity()){
                scrollToScreen();
                fling =true;
            }
            returntrue;
        }  
          
        @Override
        publicvoid onShowPress(MotionEvent e){
            super.onShowPress(e);
        }
          
        @Override  
        publicvoid onLongPress(MotionEvent e){  
            super.onLongPress(e);  
        }  
    
        @Override  
        publicboolean onScroll(MotionEvent e1, MotionEvent e2,floatdistanceX, floatdistanceY){  
            if(distanceX>0&&getScrollX()<(getChildCount()-1)*getWidth()||
                    distanceX<0&&getScrollX()>0){
                scrollBy((int)distanceX,0);
            }
            returntrue;
        }  
    
        @Override  
        publicboolean onSingleTapUp(MotionEvent e){  
            returnsuper.onSingleTapUp(e);  
        }
    }
      
    publicinterface OnScreenChangeListener {
        voidscreenChange(intcurrentTab,inttotalTab);
    }
      
    publicvoid setOnScreenChangeListener(OnScreenChangeListener onScreenChangeListener){
        this.onScreenChangeListener = onScreenChangeListener;
    }
      
    publicvoid initPageControlView(){
        if(onScreenChangeListener!=null){
            onScreenChangeListener.screenChange(0, getChildCount());
        }
    }
}

  PageControlView:

?
importcom.yang.testscroll.ScrollView.OnScreenChangeListener;
importandroid.content.Context;
importandroid.util.AttributeSet;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
  
publicclass PageControlView extendsLinearLayout implementsOnScreenChangeListener{
    privateContext context;
      
    publicPageControlView(Context context) {
        super(context);
        this.context = context;
    }
  
    publicPageControlView(Context context,AttributeSet attr){
        super(context,attr);
        this.context = context;
    }
      
    @Override
    publicvoid screenChange(intcurrentTab, inttotalTab) {
        this.removeAllViews();
        for(inti=0;i<totalTab;i++){
            ImageView iv =new ImageView(context);
            if(i==currentTab){
                iv.setImageResource(R.drawable.page_indicator_focused);
            }else{
                iv.setImageResource(R.drawable.page_indicator);
            }
            this.addView(iv);
        }
    }
}

main.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <com.yang.testscroll.ScrollView        android:id="@+id/scroll"        android:layout_width="fill_parent"        android:layout_height="fill_parent" />        <com.yang.testscroll.PageControlView        android:id="@+id/pageControl"        android:layout_width="fill_parent"        android:layout_height="40dp"        android:layout_alignParentBottom="true"        android:background="#8f00000f"         android:gravity="center"/>    </RelativeLayout>
复制代码


http://www.cnblogs.com/yyyyy5101/archive/2012/01/12/2320587.html

原创粉丝点击