今天看了下腾讯微博,看到“赞你的人”可以向右滑动然后直接返回上一级,兴趣一来,抽点空就把这个控件给做了。先看几张效果图,本人不会做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();
}
}
}
}
}
其实就是这么简单,希望大家有所收获。