使用很简单,只需继承SupportActivity,并在清单中加入android:theme="@android:style/Theme.Translucent"即可
package com.support; import com.nineoldandroids.animation.Animator; import com.nineoldandroids.animation.AnimatorListenerAdapter; import com.nineoldandroids.animation.ObjectAnimator; import com.nineoldandroids.animation.ValueAnimator; import com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; /** * 基类,所有Activity必须继承该Activity,并在清单中声明,</br> * 例 <activity android:name="com.support.test.TwoActivity" android:theme="@android:style/Theme.Translucent"/> * * </br></br> * 不要在application节点和默认启动Activity下使用 android:theme="@android:style/Theme.Translucent" * @author Young * */ public abstract class SupportActivity extends Activity { private boolean isTouchable=true;//是否可以右划返回,默认启动 的主Activity要设置为false private FrameLayout rootView; private static final String MAIN="android.intent.action.MAIN"; private int width ;//屏幕宽度 private final int time=200;//动画时长 public void setContentView(View root) { addContainer(root); } public void setContentView(int layoutRes) { addContainer(LayoutInflater.from(getApplicationContext()).inflate(layoutRes, null)); } private void addContainer(View root) { requestWindowFeature(Window.FEATURE_NO_TITLE); Intent intent=getIntent(); //把用户要显示的界面加入到可右划的布局中 ContainerView frameLayout=new ContainerView(getApplicationContext()); frameLayout.setBackgroundColor(Color.parseColor("#88000000")); frameLayout.addView(root); rootView=frameLayout; if (intent==null||MAIN.equals(intent.getAction())) { frameLayout.canTouch(false); isTouchable=false; } super.setContentView(rootView); } @Override public void startActivity(Intent intent) { // TODO Auto-generated method stub super.startActivity(intent); overridePendingTransition(0, 0);//取消用户设置的或系统默认的Activity切换动画 } @Override public void finish() { if (isTouchable==false) { super.finish(); overridePendingTransition(0, 0);//取消用户设置的或系统默认的Activity切换动画 return; } // TODO Auto-generated method stub ObjectAnimator animator= ObjectAnimator.ofFloat(rootView.getChildAt(0), "translationX", 0,width); animator.setDuration(time*2); animator.addListener(new AnimatorListenerAdapter(){ @Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub super.onAnimationEnd(animation); endToFinish(); } }); animator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { // TODO Auto-generated method stub Float cost=(Float) animation.getAnimatedValue(); float alp=(float) (1-cost/time/2 ); rootView.setAlpha(alp); rootView.getChildAt(0).setAlpha(alp); } }); animator.start(); overridePendingTransition(0, 0); } private void endToFinish(){ super.finish(); } @Override//取消用户设置的或系统默认的Activity切换动画 public void overridePendingTransition(int enterAnim, int exitAnim ) { super.overridePendingTransition(0, 0); } /** * 可右划的容器 * @author Young * */ private final class ContainerView extends FrameLayout { /** * 按下时x坐标 */ private float downX; private float downY; private Context context; /** * 左侧8dp为右划感应区域 */ private final int scaledTouchSlop=8; public ContainerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context=context; getScreenWidth(); } public ContainerView(Context context, AttributeSet attrs) { super(context, attrs); this.context=context; getScreenWidth(); } public ContainerView(Context context) { super(context); this.context=context; getScreenWidth(); } private void getScreenWidth() { // TODO Auto-generated method stub WindowManager wm = (WindowManager)context .getSystemService(Context.WINDOW_SERVICE); width = wm.getDefaultDisplay().getWidth(); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction()==MotionEvent.ACTION_DOWN) { downX=ev.getRawX(); downY=ev.getRawX(); return super.onInterceptTouchEvent(ev);//交给子控件处理事件 } if (ev.getAction()==MotionEvent.ACTION_MOVE) { float x=ev.getRawX(); float y=ev.getRawX(); //ViewConfiguration.get(context).getScaledTouchSlop() 手机可以识别是最小滑动距离 if (x-downX>Math.abs(y-downY)&&Math.abs(x-downX)>=ViewConfiguration.get(context).getScaledTouchSlop()&&downX<dip2px(scaledTouchSlop ) ) { return true;//交给自己的onTouchEvent(MotionEvent event)处理事件 } } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if (isTouchable==false) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_MOVE: if (downX<dip2px(scaledTouchSlop)&&getChildCount()==1) { getChildAt(0).setTranslationX(event.getRawX()-downX); float alp=(float) ((event.getRawX()-downX)/width ); setAlpha(1-alp); // getChildAt(0).setAlpha(1-alp/5); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (downX<dip2px(scaledTouchSlop)&&getChildCount()==1) { float t=getChildAt(0).getTranslationX(); if (t>width/2) {// ObjectAnimator animator= ObjectAnimator.ofFloat(getChildAt(0), "translationX", t,width); animator.setDuration(time); ObjectAnimator.ofFloat(this, "translationX", t,width).setDuration(time).start(); animator.addListener(new AnimatorListenerAdapter(){ @Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub super.onAnimationEnd(animation); endToFinish(); } }); animator.start(); }else{ ObjectAnimator animator= ObjectAnimator.ofFloat(getChildAt(0), "translationX", t,0); animator.setDuration(time); animator.addListener(new AnimatorListenerAdapter(){ @Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub super.onAnimationEnd(animation); getChildAt(0).setAlpha(1); setAlpha(1); } }); animator.start(); } } break; } return true; } public int dip2px( float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } public void canTouch(boolean flag) { isTouchable=flag; } } }
原文地址:http://blog.csdn.net/qingchunweiliang/article/details/45542545