android仿人人网右边可推出的效果

简介:
添加了拖动功能,按住小图标,拖动超过一半的时候打开,没到一半的时候关闭。只添加了OnGestureListener接口和OnTouchListener。 

具体代码看下面: 

package com.dl.test;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout.LayoutParams;

public class App extends Activity implements OnPanelStatusChangedListener,OnTouchListener,GestureDetector.OnGestureListener{
	private boolean hasMeasured=false;
	private LinearLayout layout_left;
	private LinearLayout layout_right;
	private ImageView iv;
	
	private int layout_left_width,layout_right_width=0;
	/**每次自动展开/收缩的范围*/  
	private int MAX_WIDTH=0;
	/**每次自动展开/收缩的速度*/  
    private final static int SPEED=20;
    
    private GestureDetector mGestureDetector;
	private boolean isScrolling=false;
	private float mScrollX;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
      		
        layout_left=(LinearLayout)findViewById(R.id.layout_left);
        layout_right=(LinearLayout)findViewById(R.id.layout_right);
        iv=(ImageView)findViewById(R.id.iv);
        
        iv.setOnTouchListener(this);
        //定义手势识别
  		mGestureDetector = new GestureDetector(this,this);
  		mGestureDetector.setIsLongpressEnabled(false);
  		
        calculatorWidth();
        
    }
    
    
    @Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
	}

	@Override
	public void onAttachedToWindow() {
		// TODO Auto-generated method stub
		super.onAttachedToWindow();
	}

	private void calculatorWidth(){
		 ViewTreeObserver observer = layout_right.getViewTreeObserver();
		//为了取得控件的宽
//       observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
//           @Override
//           public void onGlobalLayout() {
//		        if (hasMeasured == false){
//		        	layout_right_width = layout_right.getMeasuredWidth();//105
//		            layout_left_width=layout_left.getMeasuredWidth();//480
//		            MAX_WIDTH=layout_left_width-layout_right_width;//375
//		            hasMeasured = true;
//		        }
//           }
//       });
       //为了取得控件的宽
       observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
           public boolean onPreDraw(){
               if (hasMeasured == false){
               	layout_right_width = layout_right.getMeasuredWidth();
                   layout_left_width=layout_left.getMeasuredWidth();
                   MAX_WIDTH=layout_left_width-layout_right_width;
//                   Log.i("tag", "MAX_WIDTH=="+MAX_WIDTH);
                   hasMeasured = true;

//设置可拉动容器的宽为全屏(即不可拉动容器)的宽
                   View layout_max_width=findViewById(R.id.layout_max_width);
                   LinearLayout.LayoutParams lp=(LinearLayout.LayoutParams)layout_max_width.getLayoutParams();
                   lp.width=layout_left_width;
                   layout_max_width.setLayoutParams(lp);
               }
               return true;
           }
       });
	}
	class AsynMove extends AsyncTask<Integer, Integer, Void> {  
    	  
        @Override  
        protected Void doInBackground(Integer... params) {  
            int times;  
            if (MAX_WIDTH % Math.abs(params[0]) == 0)// 整除  
                times = MAX_WIDTH / Math.abs(params[0]);  
            else  
                times = MAX_WIDTH / Math.abs(params[0]) + 1;// 有余数  
  
            for (int i = 0; i < times; i++) {  
                publishProgress(params);  
                try {  
                    Thread.sleep(Math.abs(params[0]));  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
            return null;  
        }  
  
        @Override  
        protected void onProgressUpdate(Integer... params) {
            LayoutParams lp = (LayoutParams)layout_right.getLayoutParams();
            if (params[0] < 0)  
                lp.leftMargin = Math.max(lp.leftMargin + params[0], 0);
            else  
                lp.leftMargin = Math.min(lp.leftMargin + params[0], MAX_WIDTH);
  
            if(lp.leftMargin<=0){//展开之后  
                onPanelOpened();//调用OPEN回调函数  
            }
            else if(lp.leftMargin>=MAX_WIDTH){//收缩之后  
                onPanelClosed();//调用CLOSE回调函数  
            }
            layout_right.setLayoutParams(lp);  
        }  
    }

	@Override
	public void onPanelOpened() {
		// TODO Auto-generated method stub
//		Log.i("tag", "=========onPanelOpened========");
	}

	@Override
	public void onPanelClosed() {
		// TODO Auto-generated method stub
//		Log.i("tag", "=========onPanelClosed========");
	}

	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		mScrollX=0;
		isScrolling=false;
		return true;//需要返回ture才能触发onSingleTapUp
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub
	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		LayoutParams lp = (android.widget.RelativeLayout.LayoutParams)layout_right.getLayoutParams();
		
		if (lp.leftMargin >=MAX_WIDTH)// CLOSE的状态  
            new AsynMove().execute(new Integer[] { -SPEED });// 负数展开  
        else if (lp.leftMargin >= 0)// OPEN的状态  
            new AsynMove().execute(new Integer[] { SPEED });// 正数收缩
		return true;
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		isScrolling=true;
		mScrollX+=distanceX;//distanceX:向左为正,右为负
		LayoutParams lp = (LayoutParams)layout_right.getLayoutParams();
		lp.leftMargin=lp.leftMargin-(int)mScrollX;
		if(lp.leftMargin<=0){//展开之后  
			isScrolling=false;//拖过头了不需要再执行AsynMove了
			lp.leftMargin=0;
			onPanelOpened();//调用OPEN回调函数  
		}
		if(lp.leftMargin>=MAX_WIDTH){//收缩之后  
			isScrolling=false;
			lp.leftMargin=MAX_WIDTH;
			onPanelClosed();//调用CLOSE回调函数  
		}
		layout_right.setLayoutParams(lp);
		
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		//拖到一半放开手指时的运动
		if(event.getAction()==MotionEvent.ACTION_UP && isScrolling==true){
			LayoutParams lp=(LayoutParams) layout_right.getLayoutParams();
			if (lp.leftMargin >= (MAX_WIDTH>>1)) {//往左没超过一半
				new AsynMove().execute(new Integer[] { SPEED });
			} 
			else{
				new AsynMove().execute(new Integer[] { -SPEED });
			}
		}
		return mGestureDetector.onTouchEvent(event); 
	}  
      
    
}

TestMenu.zip  (157.1 KB)
相关文章
|
Android开发 iOS开发
Android 仿ios屏幕右边的圆圈
public class TopFloatService extends Service implements OnClickListener,OnKeyListener{ WindowManager wm = null; WindowManager.LayoutParams ballWmParams = null; private View ballView;
1856 0
|
15天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
9天前
|
存储 安全 Android开发
安卓应用开发:构建一个高效的用户登录系统
【5月更文挑战第3天】在移动应用开发中,用户登录系统的设计与实现是至关重要的一环。对于安卓平台而言,一个高效、安全且用户体验友好的登录系统能够显著提升应用的用户留存率和市场竞争力。本文将探讨在安卓平台上实现用户登录系统的最佳实践,包括对最新身份验证技术的应用、安全性考量以及性能优化策略。
|
12天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
13天前
|
监控 Java Android开发
安卓应用开发:打造高效用户界面的五大策略
【4月更文挑战第29天】 在安卓应用开发的世界中,构建一个既美观又高效的用户界面(UI)对于吸引和保留用户至关重要。本文将深入探讨五种策略,这些策略可以帮助开发者优化安卓应用的UI性能。我们将从布局优化讲起,逐步过渡到绘制优化、内存管理、异步处理以及最终的用户交互细节调整。通过这些实践技巧,你将能够为用户提供流畅而直观的体验,确保你的应用在竞争激烈的市场中脱颖而出。
|
2天前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
|
2天前
|
物联网 Java 开发工具
安卓应用开发:打造未来移动生活
【5月更文挑战第10天】 随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的一部分。作为智能手机市场的两大巨头,安卓和iOS分别占据了一定的市场份额。在这篇文章中,我们将重点关注安卓应用开发,探讨如何利用先进的技术和创新思维,为用户打造更加便捷、智能的移动生活。文章将涵盖安卓应用开发的基本概念、关键技术、以及未来发展趋势等方面的内容。
|
3天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
11 0