升級滑動銷燬activity,隨着手勢的滑動而滑動的效果

文章開頭先註明本滑動銷燬是對

http://blog.csdn.net/xiaanming/article/details/20934541

這篇博客的內容進行一個小小的修改

增加向左滑動打開另外一個activity

可以通過設置向左向右設置回調效果,這個效果是我忘設置背景透明瞭



現在開看一下主要的代碼,稍微修改了一下

具體可以開原博主的解析,解析已經很詳細了的

不過改着改着感覺這個功能有點雞肋,跟viewpager實現的樣子差不多了

package com.example.testsildingfinishlayout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.Scroller;

/**
 * 自定義可以滑動的RelativeLayout, 類似於IOS的滑動刪除頁面效果,當我們要使用
 * 此功能的時候,需要將該Activity的頂層佈局設置爲SildingFinishLayout
 * 要注意:android 觸摸事件分發攔截(如果子View或者子ViewGroup裏面還有事件監聽方法要先排除)
 * 
 * @email  [email protected]
 * 
 */
public class SildingFinishLayout extends RelativeLayout{
	/**
	 * SildingFinishLayout佈局的父佈局
	 */
	private ViewGroup mParentView;
	/**
	 * 滑動的最小距離
	 */
	private int mTouchSlop;
	/**
	 * 按下點的X座標
	 */
	private int downX;
	/**
	 * 按下點的Y座標
	 */
	private int downY;
	/**
	 * 臨時存儲X座標
	 */
	private int tempX;
	/**
	 * 滑動類
	 */
	private Scroller mScroller;
	/**
	 * SildingFinishLayout的寬度
	 */
	private int viewWidth;
	
	private boolean isSilding;
	
	private OnSildingFinishListener onSildingFinishListener;
	private boolean isFinish;
	private int direction = -1;
	/**
	 * 是否可以向某個方向滾動
	 */
	private boolean isSetLeft = false;
	private boolean isSetRight = false;
	private boolean isSetLeft_Right = false;
	/**
	 * 是否是人工滾動回原來的地方
	 */
	private boolean byPeople = false;
	

	public SildingFinishLayout(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
		mScroller = new Scroller(context);
	}
	/**
	 * 1 代表向左滑動
	 * 2代表向右
	 * 3代表左右
	 * @param direction
	 */
	public void setSlidingDirection(int direction)
	{
		switch(direction){
			case 1:isSetLeft=true;break;
			case 2:isSetRight=true;break;
			case 3:isSetLeft_Right=true;break;
			default:return;
		}
			
	}
	/**
	 * 事件攔截操作
	 */
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			downX = tempX = (int) ev.getRawX();
			downY = (int) ev.getRawY();
			break;
		case MotionEvent.ACTION_MOVE:
			int moveX = (int) ev.getRawX();
			//滿足此條件屏蔽SildingFinishLayout裏面子類的touch事件
			if (Math.abs(moveX - downX) > mTouchSlop
					&& Math.abs((int) ev.getRawY() - downY) < mTouchSlop 
					&& (isSetLeft||isSetRight||isSetLeft_Right)) {
				System.out.println("屏蔽子類的touch事件");
				return true;
			}
			break;
		}
		
		return super.onInterceptTouchEvent(ev);
	}
	

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		switch (event.getAction()) {
		case MotionEvent.ACTION_MOVE:
			int moveX = (int) event.getRawX();
			int deltaX = tempX - moveX;
			tempX = moveX;
			if (Math.abs(moveX - downX) > mTouchSlop
					&& Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
				System.out.println("isSilding == true;");
				isSilding = true;
			}
			
			if (Math.abs(moveX - downX)>= 0 && isSilding) {
				System.out.println("mParentView.scrollBy("+deltaX+", 0);");
				System.out.println("moveX - downX = "+(moveX - downX));
				if(((moveX - downX) > 0 && isSetLeft) || ((moveX - downX) < 0 && isSetRight) || isSetLeft_Right)
					mParentView.scrollBy(deltaX, 0);
			}
			break;
		case MotionEvent.ACTION_UP:
			isSilding = false;
			System.out.println("mParentView.getScrollX() -->"+mParentView.getScrollX() );
			if (mParentView.getScrollX() <= -viewWidth / 2) {
				isFinish = true;
				direction = 1;
				scrollRight();
			} else if(mParentView.getScrollX() >= viewWidth / 2){
				isFinish = true;
				direction=2;
				scrollLeft();
			}else{
				isFinish = false;
				direction=0;
				scrollOrigin(false);
				
			}
			break;
		}
		return true;
	}
	
	

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);
		if (changed) {
			// 獲取SildingFinishLayout所在佈局的父佈局
			mParentView = (ViewGroup) this.getParent();
			viewWidth = this.getWidth();
		}
	}

	/**
	 * 設置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity
	 * 
	 * @param onSildingFinishListener
	 */
	public void setOnSildingFinishListener(
			OnSildingFinishListener onSildingFinishListener) {
		this.onSildingFinishListener = onSildingFinishListener;
	}


	/**
	 * 從左向右滾動出界面
	 */
	private void scrollRight() {
		final int delta = (viewWidth + mParentView.getScrollX());
		// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
		mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
				Math.abs(delta));
		postInvalidate();
	}
	
	/**
	 * 從左向右滾動出界面
	 */
	private void scrollLeft() {
		final int delta = (viewWidth - mParentView.getScrollX());
		// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
		mScroller.startScroll(mParentView.getScrollX(), 0, delta - 1, 0,
				Math.abs(delta));
		postInvalidate();
	}

	/**
	 * 滾動到起始位置
	 */
	public void scrollOrigin(boolean byPeople) {
		//getScrollX() ---> Return the scrolled left position of this view(返回偏離了屏幕左邊界多遠  “正數(左邊界|)負數”)
		this.byPeople = byPeople;
		int delta = mParentView.getScrollX();
		mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
				Math.abs(delta));
		postInvalidate();
	}


	@Override
	public void computeScroll() {
		// 調用startScroll的時候scroller.computeScrollOffset()返回值爲boolean,true說明滾動尚未完成,false說明滾動已經完成
		if (mScroller.computeScrollOffset()) {
			mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
			postInvalidate();

			if (mScroller.isFinished() && isFinish) {

				if (onSildingFinishListener != null) {
					if(!this.byPeople){
						onSildingFinishListener.onSildingFinish(direction);
						}
					this.byPeople = false;
						
				}else{
					//沒有設置OnSildingFinishListener,讓其滾動到其實位置
					scrollOrigin(false);
					isFinish = false;
				}
			}
		}
	}
	

	public interface OnSildingFinishListener {
		/**
		 * 從左向右滾動出界面 type=1
		 * 從右向左滾動出界面 type=2
		 * @param type
		 */
		public void onSildingFinish(int type);
	}

}


看一下這些activity裏面的代碼

第一個activity只能向左滑動打開新的activity

package com.example.testsildingfinishlayout;

import com.example.testsildingfinishlayout.SildingFinishLayout.OnSildingFinishListener;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends Activity {
	SildingFinishLayout sildingFinishLayout=null;
	boolean flag = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        sildingFinishLayout= (SildingFinishLayout) findViewById(R.id.num1);
        sildingFinishLayout
				.setOnSildingFinishListener(new OnSildingFinishListener() {

					@Override
					public void onSildingFinish(int type) {
						if (type ==2){
							Intent fromSpiltOuttoPostIntent = new Intent();
							fromSpiltOuttoPostIntent.setClass(MainActivity.this,
									Num2Activity.class);
							startActivity(fromSpiltOuttoPostIntent);
							
						}
							
					}
				});
        //設置只能向左滑動打開新的activity
        sildingFinishLayout.setSlidingDirection(2);
    }


    @Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		//當從新顯示當前頁面的時候把sildingFinishLayout滾回到屏幕可視範圍,之前已經滾出了屏幕
		if(flag)
			sildingFinishLayout.scrollOrigin(true);//將原來私有的滾會初始位置的方法設爲public
	}


	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		flag = true;
	}


	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

第二個activity可以向右滑動finish掉自己,也可以向左滑動打開第三個activity

package com.example.testsildingfinishlayout;

import com.example.testsildingfinishlayout.SildingFinishLayout.OnSildingFinishListener;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class Num2Activity extends Activity {
	SildingFinishLayout sildingFinishLayout=null;
	boolean flag = false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_num2);
		
		sildingFinishLayout= (SildingFinishLayout) findViewById(R.id.num2);
        sildingFinishLayout
				.setOnSildingFinishListener(new OnSildingFinishListener() {

					@Override
					public void onSildingFinish(int type) {
						if (type == 1)
							Num2Activity.this.finish();
						if (type ==2){
							Intent fromSpiltOuttoPostIntent = new Intent();
							fromSpiltOuttoPostIntent.setClass(Num2Activity.this,
									Num3Activity.class);
							startActivity(fromSpiltOuttoPostIntent);
							
						}
							
					}
				});
        sildingFinishLayout.setSlidingDirection(3);
	}
	 @Override
		protected void onResume() {
			// TODO Auto-generated method stub
			super.onResume();
			if(flag)
				sildingFinishLayout.scrollOrigin(true);
		}
	 @Override
		protected void onStop() {
			// TODO Auto-generated method stub
			super.onStop();
			flag = true;
		}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.num2, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

第三個activity就不貼代碼了,就是那回事




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章