仿人人网右边可推出的效果(带拖动)

添加了拖动功能,按住小图标,拖动超过一半的时候打开,没到一半的时候关闭。只添加了OnGestureListener接口和OnTouchListener。
具体代码看下面:
Java代码 复制代码  收藏代码
  1. package com.dl.test;   
  2.   
  3. import android.app.Activity;   
  4. import android.os.AsyncTask;   
  5. import android.os.Bundle;   
  6. import android.util.Log;   
  7. import android.view.GestureDetector;   
  8. import android.view.MotionEvent;   
  9. import android.view.View;   
  10. import android.view.View.OnTouchListener;   
  11. import android.view.ViewTreeObserver;   
  12. import android.widget.ImageView;   
  13. import android.widget.LinearLayout;   
  14. import android.widget.RelativeLayout.LayoutParams;   
  15.   
  16. public class App extends Activity implements OnPanelStatusChangedListener,OnTouchListener,GestureDetector.OnGestureListener{   
  17.     private boolean hasMeasured=false;   
  18.     private LinearLayout layout_left;   
  19.     private LinearLayout layout_right;   
  20.     private ImageView iv;   
  21.        
  22.     private int layout_left_width,layout_right_width=0;   
  23.     /**每次自动展开/收缩的范围*/     
  24.     private int MAX_WIDTH=0;   
  25.     /**每次自动展开/收缩的速度*/     
  26.     private final static int SPEED=20;   
  27.        
  28.     private GestureDetector mGestureDetector;   
  29.     private boolean isScrolling=false;   
  30.     private float mScrollX;   
  31.     /** Called when the activity is first created. */  
  32.     @Override  
  33.     public void onCreate(Bundle savedInstanceState) {   
  34.         super.onCreate(savedInstanceState);   
  35.         setContentView(R.layout.main);   
  36.                
  37.         layout_left=(LinearLayout)findViewById(R.id.layout_left);   
  38.         layout_right=(LinearLayout)findViewById(R.id.layout_right);   
  39.         iv=(ImageView)findViewById(R.id.iv);   
  40.            
  41.         iv.setOnTouchListener(this);   
  42.         //定义手势识别   
  43.         mGestureDetector = new GestureDetector(this,this);   
  44.         mGestureDetector.setIsLongpressEnabled(false);   
  45.            
  46.         calculatorWidth();   
  47.            
  48.     }   
  49.        
  50.        
  51.     @Override  
  52.     protected void onResume() {   
  53.         // TODO Auto-generated method stub   
  54.         super.onResume();   
  55.            
  56.     }   
  57.   
  58.     @Override  
  59.     public void onAttachedToWindow() {   
  60.         // TODO Auto-generated method stub   
  61.         super.onAttachedToWindow();   
  62.     }   
  63.   
  64.     private void calculatorWidth(){   
  65.          ViewTreeObserver observer = layout_right.getViewTreeObserver();   
  66.         //为了取得控件的宽   
  67. //       observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {   
  68. //           @Override   
  69. //           public void onGlobalLayout() {   
  70. //              if (hasMeasured == false){   
  71. //                  layout_right_width = layout_right.getMeasuredWidth();//105   
  72. //                  layout_left_width=layout_left.getMeasuredWidth();//480   
  73. //                  MAX_WIDTH=layout_left_width-layout_right_width;//375   
  74. //                  hasMeasured = true;   
  75. //              }   
  76. //           }   
  77. //       });   
  78.        //为了取得控件的宽   
  79.        observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){   
  80.            public boolean onPreDraw(){   
  81.                if (hasMeasured == false){   
  82.                 layout_right_width = layout_right.getMeasuredWidth();   
  83.                    layout_left_width=layout_left.getMeasuredWidth();   
  84.                    MAX_WIDTH=layout_left_width-layout_right_width;   
  85. //                   Log.i("tag", "MAX_WIDTH=="+MAX_WIDTH);   
  86.                    hasMeasured = true;   
  87.   
  88. //设置可拉动容器的宽为全屏(即不可拉动容器)的宽   
  89.                    View layout_max_width=findViewById(R.id.layout_max_width);   
  90.                    LinearLayout.LayoutParams lp=(LinearLayout.LayoutParams)layout_max_width.getLayoutParams();   
  91.                    lp.width=layout_left_width;   
  92.                    layout_max_width.setLayoutParams(lp);   
  93.                }   
  94.                return true;   
  95.            }   
  96.        });   
  97.     }   
  98.     class AsynMove extends AsyncTask<Integer, Integer, Void> {     
  99.              
  100.         @Override     
  101.         protected Void doInBackground(Integer... params) {     
  102.             int times;     
  103.             if (MAX_WIDTH % Math.abs(params[0]) == 0)// 整除     
  104.                 times = MAX_WIDTH / Math.abs(params[0]);     
  105.             else     
  106.                 times = MAX_WIDTH / Math.abs(params[0]) + 1;// 有余数     
  107.      
  108.             for (int i = 0; i < times; i++) {     
  109.                 publishProgress(params);     
  110.                 try {     
  111.                     Thread.sleep(Math.abs(params[0]));     
  112.                 } catch (InterruptedException e) {     
  113.                     // TODO Auto-generated catch block     
  114.                     e.printStackTrace();     
  115.                 }     
  116.             }     
  117.             return null;     
  118.         }     
  119.      
  120.         @Override     
  121.         protected void onProgressUpdate(Integer... params) {   
  122.             LayoutParams lp = (LayoutParams)layout_right.getLayoutParams();   
  123.             if (params[0] < 0)     
  124.                 lp.leftMargin = Math.max(lp.leftMargin + params[0], 0);   
  125.             else     
  126.                 lp.leftMargin = Math.min(lp.leftMargin + params[0], MAX_WIDTH);   
  127.      
  128.             if(lp.leftMargin<=0){//展开之后     
  129.                 onPanelOpened();//调用OPEN回调函数     
  130.             }   
  131.             else if(lp.leftMargin>=MAX_WIDTH){//收缩之后     
  132.                 onPanelClosed();//调用CLOSE回调函数     
  133.             }   
  134.             layout_right.setLayoutParams(lp);     
  135.         }     
  136.     }   
  137.   
  138.     @Override  
  139.     public void onPanelOpened() {   
  140.         // TODO Auto-generated method stub   
  141. //      Log.i("tag", "=========onPanelOpened========");   
  142.     }   
  143.   
  144.     @Override  
  145.     public void onPanelClosed() {   
  146.         // TODO Auto-generated method stub   
  147. //      Log.i("tag", "=========onPanelClosed========");   
  148.     }   
  149.   
  150.     @Override  
  151.     public boolean onDown(MotionEvent e) {   
  152.         // TODO Auto-generated method stub   
  153.         mScrollX=0;   
  154.         isScrolling=false;   
  155.         return true;//需要返回ture才能触发onSingleTapUp   
  156.     }   
  157.   
  158.     @Override  
  159.     public void onShowPress(MotionEvent e) {   
  160.         // TODO Auto-generated method stub   
  161.     }   
  162.   
  163.     @Override  
  164.     public boolean onSingleTapUp(MotionEvent e) {   
  165.         // TODO Auto-generated method stub   
  166.         LayoutParams lp = (android.widget.RelativeLayout.LayoutParams)layout_right.getLayoutParams();   
  167.            
  168.         if (lp.leftMargin >=MAX_WIDTH)// CLOSE的状态     
  169.             new AsynMove().execute(new Integer[] { -SPEED });// 负数展开     
  170.         else if (lp.leftMargin >= 0)// OPEN的状态     
  171.             new AsynMove().execute(new Integer[] { SPEED });// 正数收缩   
  172.         return true;   
  173.     }   
  174.   
  175.     @Override  
  176.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,   
  177.             float distanceY) {   
  178.         // TODO Auto-generated method stub   
  179.         isScrolling=true;   
  180.         mScrollX+=distanceX;//distanceX:向左为正,右为负   
  181.         LayoutParams lp = (LayoutParams)layout_right.getLayoutParams();   
  182.         lp.leftMargin=lp.leftMargin-(int)mScrollX;   
  183.         if(lp.leftMargin<=0){//展开之后     
  184.             isScrolling=false;//拖过头了不需要再执行AsynMove了   
  185.             lp.leftMargin=0;   
  186.             onPanelOpened();//调用OPEN回调函数     
  187.         }   
  188.         if(lp.leftMargin>=MAX_WIDTH){//收缩之后     
  189.             isScrolling=false;   
  190.             lp.leftMargin=MAX_WIDTH;   
  191.             onPanelClosed();//调用CLOSE回调函数     
  192.         }   
  193.         layout_right.setLayoutParams(lp);   
  194.            
  195.         return false;   
  196.     }   
  197.   
  198.     @Override  
  199.     public void onLongPress(MotionEvent e) {   
  200.         // TODO Auto-generated method stub   
  201.            
  202.     }   
  203.   
  204.     @Override  
  205.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,   
  206.             float velocityY) {   
  207.         // TODO Auto-generated method stub   
  208.         return false;   
  209.     }   
  210.     @Override  
  211.     public boolean onTouch(View v, MotionEvent event) {   
  212.         // TODO Auto-generated method stub   
  213.         //拖到一半放开手指时的运动   
  214.         if(event.getAction()==MotionEvent.ACTION_UP && isScrolling==true){   
  215.             LayoutParams lp=(LayoutParams) layout_right.getLayoutParams();   
  216.             if (lp.leftMargin >= (MAX_WIDTH>>1)) {//往左没超过一半   
  217.                 new AsynMove().execute(new Integer[] { SPEED });   
  218.             }    
  219.             else{   
  220.                 new AsynMove().execute(new Integer[] { -SPEED });   
  221.             }   
  222.         }   
  223.         return mGestureDetector.onTouchEvent(event);    
  224.     }     
  225.          
  226.        
  227. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值