Androidの左スライドでウィンドウを閉じる
7112 ワード
前言
現在、市場の多くのアプリにはウィンドウのスライド切り替えがあり、このような切り替えは、ユーザーの操作を快適にし、機能点も大気的だと感じている.ここでは、簡単な方法をまとめ、基礎ウィンドウに直接置き換え、アンドロイドの最も基礎的な方法で実現した.
需要説明まずどこからスライドするかを明確にする:一般的な習慣は左端から スライドする.指がスライドしている間にページが移動する 指を緩めた後、滑り出して閉じるか、それとも以前の状態に戻るかを判断します.
実装コード
一、フレームレイアウトを継承し、書き換え方法:
二、エッジのシャドウleft_shadow.xml:
三、baseActivityにコードを追加する:
四、総括:このような実現にはまだ多くの方法があります.私はここで自分がいいと思う方法を推薦しました.必要な子供靴たちが直接copyプロジェクトで使えばいいです.中にはアンドロイドが持っている方法がたくさんあります.後期にもっと改善させました
現在、市場の多くのアプリにはウィンドウのスライド切り替えがあり、このような切り替えは、ユーザーの操作を快適にし、機能点も大気的だと感じている.ここでは、簡単な方法をまとめ、基礎ウィンドウに直接置き換え、アンドロイドの最も基礎的な方法で実現した.
需要説明
実装コード
一、フレームレイアウトを継承し、書き換え方法:
public class ArActSlidLayout extends FrameLayout {
//
private static final int SHADOW_WIDTH = 16;
private Activity mActivity;
private Scroller mScroller; // , , ;
//
private Drawable mLeftShadow;
//
private int mShadowWidth;
private int mInterceptDownX; // , x
private int mLastInterceptX;//
private int mLastInterceptY;
private int mTouchDownX; // x
private int mLastTouchX;
private int mLastTouchY;
private boolean isConsumed = false;
public ArActSlidLayout(Context context) {
this(context, null);
}
public ArActSlidLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ArActSlidLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context) {
mScroller = new Scroller(context);
mLeftShadow = getResources().getDrawable(R.drawable.left_shadow);//
int density = (int) getResources().getDisplayMetrics().density;
mShadowWidth = SHADOW_WIDTH * density;// ;
}
/**
* Activity
*/
public void bindActivity(Activity activity) {
mActivity = activity;
ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView();
View child = decorView.getChildAt(0);
decorView.removeView(child);
addView(child);
decorView.addView(this);// ViewGroup ;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {//
boolean intercept = false;
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
intercept = false;
mInterceptDownX = x;
mLastInterceptX = x;
mLastInterceptY = y;
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastInterceptX;
int deltaY = y - mLastInterceptY;
// , ,
if (mInterceptDownX < (getWidth() / 10) && Math.abs(deltaX) > Math.abs(deltaY)) {
intercept = true;// ;
} else {
intercept = false;
}
mLastInterceptX = x;
mLastInterceptY = y;
break;
case MotionEvent.ACTION_UP:
intercept = false;
mInterceptDownX = mLastInterceptX = mLastInterceptY = 0;// ;
break;
}
//Log.e("event", " Intercep " + " x: " + x + " y: " + y);
return intercept;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {// , ;
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchDownX = x;
mLastTouchX = x;
mLastTouchY = y;
//Log.e("event", " onTouchEventDOWN " + " x: " + x + " y: " + y);
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastTouchX;
int deltaY = y - mLastTouchY;
if (!isConsumed && mTouchDownX < (getWidth() / 10) && Math.abs(deltaX) > Math.abs(deltaY)) {
isConsumed = true; //
}
if (isConsumed) {
int rightMovedX = mLastTouchX - (int) ev.getX();
//
if (getScrollX() + rightMovedX >= 0) {
//
scrollTo(0, 0);
} else {
//
scrollBy(rightMovedX, 0); // ; : , ,
}
// Log.e("event", " onTouchEventMOVE " + " x: " + x + " y: " + y + " ScrollX: " + getScrollX() + " rightMovedX: " + rightMovedX);
}
mLastTouchX = x;
mLastTouchY = y;
break;
case MotionEvent.ACTION_UP:
isConsumed = false;
mTouchDownX = mLastTouchX = mLastTouchY = 0; // ;
//
if (-getScrollX() < getWidth() / 3) {
scrollBack();
} else {
scrollClose();
}
//Log.e("event", " onTouchEventUP " + " x: " + x + " y: " + y + " ScrollX: " + getScrollX());
break;
}
//Log.e("event"," onTouchEventAll " + " getRawX(): "+ev.getRawX() +" y: " +ev.getRawY());
return true;
}
/**
*
*/
private void scrollBack() {
int startX = getScrollX();
int dx = -getScrollX();
mScroller.startScroll(startX, 0, dx, 0, 300);
invalidate();
}
/**
*
*/
private void scrollClose() {
int startX = getScrollX();
int dx = -getScrollX() - getWidth();
//Log.e("event", " scrollClose: dx " + dx + " getWidth " + getWidth());
mScroller.startScroll(startX, 0, dx, 0, 300);
invalidate();
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), 0);
//Log.e("event", " computeScroll: " + mScroller.getCurrX());
postInvalidate();
} else if (-getScrollX() >= getWidth()) {
mActivity.finish();
//Log.e("event", " computeScroll: finish " + getScrollX());
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
drawShadow(canvas);
}
/**
*
*/
private void drawShadow(Canvas canvas) {
mLeftShadow.setBounds(0, 0, mShadowWidth, getHeight());
canvas.save();
canvas.translate(-mShadowWidth, 0);
mLeftShadow.draw(canvas);
canvas.restore();
}
}
二、エッジのシャドウleft_shadow.xml:
三、baseActivityにコードを追加する:
public class ArBaseFragActivity extends BaseMMCFragmentActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (setEnableSliding()) {
ArActSlidLayout rootView = new ArActSlidLayout(this);
rootView.bindActivity(this);// :
}
}
protected boolean setEnableSliding() {// , true : ;false : ;
return true;
}
}
四、総括:このような実現にはまだ多くの方法があります.私はここで自分がいいと思う方法を推薦しました.必要な子供靴たちが直接copyプロジェクトで使えばいいです.中にはアンドロイドが持っている方法がたくさんあります.後期にもっと改善させました