文章開頭先註明本滑動銷燬是對
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就不貼代碼了,就是那回事