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();
				}
			}
		}
	}

}

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

时间: 2024-08-06 01:48:44

Android滑动页面返回(自定义控件)的相关文章

android滑动页面

使用android-support-v4.jar里面的ViewPager实现滑动页面. 基本包含三个部分: 1. 导航控件 2. 游标(指示当前页面) 3. 一个ViewPager. 例子做的比较简单就几个控件换来换去的, 每个人的想法都不同相应的实现方法也就不一样呢,关键还是思想什么的. 所谓积少成多每天看一些小例子再用自己的思想 去实现一些小例子再记录下来很有帮助的. 源码下载: http://pan.baidu.com/s/1o6NpBtS android滑动页面,布布扣,bubuko.c

Android滑动页面导航效果: PagerSlidingTabStrip

把github上的PagerSlidingTabStrip稍作修改: tab的文字颜色选中变色(原版文字不变色) 栗子:http://download.csdn.net/detail/onlyonecoder/7722021 PagerSlidingTabStrip 自定义属性列表: pstsIndicatorColor Color of the sliding indicator pstsUnderlineColor Color of the full-width line on the bo

android ViewPager页面左右滑动切换

我们日常生活中用到的微博,QQ,微信等app在进行页面左右滑动的时候,很多都可以用ViewPager来实现.可以说,ViewPager在android开发中十分常见并且特别实用. Viewpager在android.support.v4.view这个软件包中, android.support.v4.view.jar是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.所以低版本开发时必须加入android-support-v4.jar,并且在XML

Android右滑返回上一界面

今天突然心血来潮,想在自己的项目里面加一个右滑finish界面的功能.思路很简单就是拦截屏幕滑动事件,然后finish当前页面,不多说了,上代码吧. 第一步:利用VelocityTracker计算滑动速度,及一些附带的代码. private VelocityTracker mVelocityTracker = null;//速度记录器 private int getScrollVelocity() { mVelocityTracker.computeCurrentVelocity(1000);

可能是滑动页面

就是,用手左右滑动页面 首先先在layout中配置好各个页面,我配置了新建的六个图片页面. 然后新建main.xml文件, <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&qu

滑动页面带个标题。。。

跟滑动页面一样的效果不过带个标题. 与滑动页面一样的步骤先配置六个页面 然后新建main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:l

十六、Android 滑动效果汇总

Android 滑动效果入门篇(一)-- ViewFlipper Android 滑动效果入门篇(二)-- Gallery Android 滑动效果基础篇(三)-- Gallery仿图像集浏览 Android 滑动效果基础篇(四)-- Gallery + GridView Android 滑动效果进阶篇(五)-- 3D旋转 Android 滑动效果进阶篇(六)-- 倒影效果 ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,

android之无返回结果跳转intent

android之无返回结果跳转intent: (注意跳转的时候要传像user的对象必须实现Serializable接口) 登陆页面布局:layout/activity_login.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:lay

android之有返回结果跳转intent

android之有返回结果跳转intent: (1.注意跳转的时候要传像user的对象必须实现Serializable接口,2.login的java代码中setResult(RESULT_OK, intent);后一定要调用finish()方法) 主页面布局:layout/activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:to