现在的位置: 首页 > 综合 > 正文

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

2013年09月15日 ⁄ 综合 ⁄ 共 6219字 ⁄ 字号 评论关闭
添加了拖动功能,按住小图标,拖动超过一半的时候打开,没到一半的时候关闭。只添加了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.   

抱歉!评论已关闭.