zoukankan      html  css  js  c++  java
  • Android滑动页面返回(自定义控件)

    今天看了下腾讯微博,看到“赞你的人”可以向右滑动然后直接返回上一级,兴趣一来,抽点空就把这个控件给做了。先看几张效果图,本人不会做gif,亲们能理解就OK了。

             

    话不多说,现在直接贴出源码吧。

    首先看下调用方式

    package com.fay.backwidget;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    import com.fay.backwidget.SlidingBackLinearLayout.FinishCallBack;
    /**
     * @version 1.0
     * @author Fay
     * @since 2014/8/28
     */
    public class SlidingBackActivity extends Activity {
    	private SlidingBackLinearLayout mBackLinearLayout = null;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_two);
    		mBackLinearLayout = (SlidingBackLinearLayout) findViewById(R.id.back_linearlayout);
    		mBackLinearLayout.setFinishCallBack(new FinishCallBack() {
    			
    			@Override
    			public void finish() {
    				// TODO Auto-generated method stub
    				SlidingBackActivity.this.finish();
    			}
    		});
    	}
    
    }
    

      可以看到调用的方式十分简单,这就是我们每一个开发者追求的,高内聚低耦合,下面我把自定义控件贴出来吧。

    package com.fay.backwidget;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.util.AttributeSet;
    import android.util.DisplayMetrics;
    import android.view.MotionEvent;
    import android.view.WindowManager;
    import android.view.animation.DecelerateInterpolator;
    import android.view.animation.Interpolator;
    import android.widget.LinearLayout;
    import android.widget.Scroller;
    /**
     * @version 1.0
     * @author Fay
     * @since 2014/8/28
     */
    @SuppressLint("NewApi")
    public class SlidingBackLinearLayout extends LinearLayout {
        private int xLastTouchLocation;
        private int xCurrentTouchLocation;
        private int detaX;
        private boolean isClose = false;
        private int windowWidth ;
        private Scroller mScroller = null;
        private Interpolator mInterpolator = null; 
    	private FinishCallBack mFinishCallBack = null;
    	
    	public SlidingBackLinearLayout(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    		// TODO Auto-generated constructor stub
    		init(context);
    	}
    
    	public SlidingBackLinearLayout(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		// TODO Auto-generated constructor stub
    		init(context);
    	}
    
    	public SlidingBackLinearLayout(Context context) {
    		super(context);
    		// TODO Auto-generated constructor stub
    		init(context);
    	}
    	
    	private void init(Context mContext) {
    		mInterpolator = new DecelerateInterpolator();
    		mScroller = new Scroller(mContext, mInterpolator);
    		DisplayMetrics mDisplayMetrics = new DisplayMetrics();
    		WindowManager mWindowManager = (WindowManager) mContext.getSystemService(mContext.WINDOW_SERVICE);
    		mWindowManager.getDefaultDisplay().getMetrics(mDisplayMetrics);
    		windowWidth = mDisplayMetrics.widthPixels;
    	}
    	
    	public interface FinishCallBack{
    		void finish();
    	}
    	
    	public void setFinishCallBack(FinishCallBack mFinishCallBack) {
    		this.mFinishCallBack = mFinishCallBack;
    	}
    	
    	@Override
    	protected void onDraw(Canvas canvas) {
    		// TODO Auto-generated method stub
    		super.onDraw(canvas);
    	}
    
    	@Override
    	public boolean onTouchEvent(MotionEvent event) {
    		// TODO Auto-generated method stub
    		switch (event.getAction()) {
    		case MotionEvent.ACTION_DOWN:
    			xLastTouchLocation = (int) event.getX();
    			return true;
    		case MotionEvent.ACTION_MOVE:
    			xCurrentTouchLocation = (int) event.getX();
    			detaX = xLastTouchLocation - xCurrentTouchLocation;
    			if (detaX < 0) {
    				if (null != mFinishCallBack) {
    					scrollTo( detaX, 0);
    				}
    			}
    			break;
    		case MotionEvent.ACTION_UP:
    			xCurrentTouchLocation = (int) event.getX();
    			detaX = xLastTouchLocation - xCurrentTouchLocation;
    			if (detaX < 0) {
    				if (null != mFinishCallBack) {
    					if (- detaX >= windowWidth / 2) {
    						// close
    						isClose = true;
    						startMove( -(windowWidth + detaX));
    					} else {
    						startMove(- detaX);
    					}
    				}
    			}
    			break;
    		}
    		return super.onTouchEvent(event);
    	}
    	
    	private void startMove(int deta) {
    		mScroller.startScroll(getScrollX(), 0, deta, 0);
    		invalidate();
    	}
    
    	@Override
    	public void computeScroll() {
    		// TODO Auto-generated method stub
    		super.computeScroll();
    		if (mScroller.computeScrollOffset()) {
    			scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    			postInvalidate();
    		} else {
    			if (isClose) {
    				if (null != mFinishCallBack) {
    					mFinishCallBack.finish();
    				}
    			}
    		}
    	}
    
    }
    

      其实就是这么简单,希望大家有所收获。

  • 相关阅读:
    数据库系统原理
    Java并发编程详解读书笔记(一)
    Java基础之String
    Java基础之数据类型
    winform BackgroundWorker控件的用法
    汉子转拼音
    model验证(验证登录、注册...)
    Ajax.BeginForm 异步搜索
    Ajax.ActionLink 辅助方法实现局部刷新
    js 随笔
  • 原文地址:https://www.cnblogs.com/yinweiliang/p/3942418.html
Copyright © 2011-2022 走看看