仿Iphone右劃關閉Activity
使用很簡單,只需繼承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,並在清單中聲明, * 例 * * * 不要在application節點和預設啟動Activity下使用 android:theme="@android:style/Theme.Translucent" * @author Young * */ public abstract class SupportActivity extends Activity {private boolean isTouchable=true;//是否可以右劃返回,預設啟動 的主Activity要設定為falseprivate 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);}@Overridepublic void startActivity(Intent intent) {// TODO Auto-generated method stubsuper.startActivity(intent);overridePendingTransition(0, 0);//取消使用者佈建的或系統預設的Activity切換動畫} @Overridepublic void finish() {if (isTouchable==false) {super.finish();overridePendingTransition(0, 0);//取消使用者佈建的或系統預設的Activity切換動畫return;}// TODO Auto-generated method stubObjectAnimator animator= ObjectAnimator.ofFloat(rootView.getChildAt(0), "translationX", 0,width);animator.setDuration(time*2);animator.addListener(new AnimatorListenerAdapter(){@Overridepublic void onAnimationEnd(Animator animation) {// TODO Auto-generated method stubsuper.onAnimationEnd(animation);endToFinish(); }});animator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {// TODO Auto-generated method stubFloat 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 stubWindowManager wm = (WindowManager)context .getSystemService(Context.WINDOW_SERVICE);width = wm.getDefaultDisplay().getWidth();}@Overridepublic 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()&&downXwidth/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(){@Overridepublic void onAnimationEnd(Animator animation) {// TODO Auto-generated method stubsuper.onAnimationEnd(animation); endToFinish();}}); animator.start();}else{ObjectAnimator animator= ObjectAnimator.ofFloat(getChildAt(0), "translationX", t,0);animator.setDuration(time);animator.addListener(new AnimatorListenerAdapter(){@Overridepublic void onAnimationEnd(Animator animation) {// TODO Auto-generated method stubsuper.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://pan.baidu.com/s/1kT1PvRD