1.ViewGroup实现slideMenu

(已经更新了,请看另外一篇)

一.

源码的原理跟上一篇上下切换view是一样的就不解析了

二.源码

 

public class ViewGp extends ViewGroup {
       private Scroller scroller;
       private static float cuX,lasX,lasXX;
       private static boolean Menuflag=true,MenuShowing=false;
       public ViewGp(Context context) {
       super(context);
       setBackgroundColor(Color.BLACK);
       scroller = new Scroller(context);
       }

 public ViewGp(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
 }

 public ViewGp(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  // TODO Auto-generated constructor stub
 }
 @Override
 public void computeScroll() {
     if(scroller.computeScrollOffset()){
     getChildAt(1).layout(scroller.getCurrX(), 0, scroller.getCurrX()+(getChildAt(1).getWidth()), getHeight());
     getChildAt(0).layout(scroller.getCurrX()-(getChildAt(1).getWidth())+50, 0, scroller.getCurrX() , getHeight());
     postInvalidate();
     }
     super.computeScroll();
 }
 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
       int viewcount = getChildCount();
       for(int count=0;count<viewcount;count++){
       View child = getChildAt(count);
       int height = child.getMeasuredHeight();
       int wdith = child.getMeasuredWidth();
       child.layout(0, 0, wdith, height);
       if(count==0){
       getChildAt(0).layout(0, 0, wdith, height);
      }
    }

 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  // TODO Auto-generated method stub
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    setMeasuredDimension(width, height);
    for(int i=0;i<getChildCount();i++){
    getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
   }
 }
 public void ShowMenu(float currN,float currX){
     scroller.startScroll((int)currN,0,(int)currX-(int)currN,0);
    invalidate();
    MenuShowing=true;
 }
 public void OpenMenu(float currN,float currX){
  scroller.startScroll((int)currN,0,(getWidth()-(int)currN-50),0);
  invalidate();
  Menuflag = false;
  MenuShowing=false;
 }
 public void CloseMenu(float currN,float currX){
  scroller.startScroll((int)currN,0,-(int)currN,0);
  invalidate();
  Menuflag = true;
  MenuShowing=false;
 }
 @Override
 public boolean dispatchTouchEvent(MotionEvent ev) {
    Log.i("Mainactivity", "---getAction>>"+ev.getAction());
  switch (ev.getAction()) {
  
  case MotionEvent.ACTION_DOWN:
     lasXX = ev.getX();
     break;
  case MotionEvent.ACTION_MOVE:
            if(Menuflag&&lasXX<50){
             cuX = ev.getX();
             if(cuX>getWidth()-50){}else{//消除空隙
              ShowMenu(cuX,lasX);
             }
             lasX = ev.getX();
            }else if(!Menuflag&&lasXX>getWidth()-50){
             cuX = ev.getX();
             if(cuX>getWidth()-50){}else{//消除空隙
              ShowMenu(cuX,lasX);
             } 
             lasX = ev.getX();
            }   
   break;
  case MotionEvent.ACTION_UP:
     Log.i("Mainactivity", "---getX>>"+getX());
     if(MenuShowing&&ev.getX()<getWidth()/2){
       CloseMenu(getX(),0);
      }else if(MenuShowing&&ev.getX()>=getWidth()/2){
         OpenMenu(ev.getX(),0);
      }
       break;  
       default:
       break;
    }
   return super.dispatchTouchEvent(ev);
  }

}  


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值