編輯:關於Android編程
下面就使用Scroller來給大家展示一下推拉門的效果
思路:
1.自定義一個類PushPullDoorView,繼承RelativeLayout、
2.初始化Scroller對象,並且設有彈動效果。根據你的手勢移動繪畫的時候展示的比較光滑。
3.在onTouchEvent方法中,會在手勢移動的中,使用scrollTo移動View。在手指離開屏幕的時候,會調用Scroller中滑動的動畫。
4.重寫computeScroll方法,判斷Scroller對象動畫是否結束,如果沒有結束,那麼使用scrollTo方法,不斷的移動View,直到動畫結束。
注意點:
在啟動Scroller對象的移動的時候,要使用invalidate表示開始刷新界面,那麼就會執行computeScroll中的代碼,在裡面不要忘了寫postInvalidate()進行刷新界面,這樣才把整個View移動的效果表現的淋淋盡致。
下面跟據代碼進行解釋:
public class PushPullDoorView extends RelativeLayout {
private final String TAG = PushPullDoorView.class.getSimpleName();
private Context mContext;
private Scroller mScroller;// 平滑滾動器
private int mScreenHeigh = 0;
private int mLastDownY = 0;
private int mCurryY;
private int mDelY;
private boolean mCloseFlag = false;// 是否隱藏View
private ImageView mImgView;
private Interpolator polator;// 滾動效果
public PushPullDoorView(Context context) {
super(context);
mContext = context;
setupView();
}
public PushPullDoorView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setupView();
}
@SuppressLint(NewApi)
private void setupView() {
initScroller();
getWindowInfo();
initImageView();
}
public void initScroller() {
polator = new BounceInterpolator();// 彈跳效果,當然也可以設置其他的效果,例如:加快效果
mScroller = new Scroller(mContext, polator);
}
public void getWindowInfo() {
// 獲取屏幕分辨率
WindowManager wm = (WindowManager) (mContext
.getSystemService(Context.WINDOW_SERVICE));
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
mScreenHeigh = dm.heightPixels;
}
public void initImageView() {
// 這裡你一定要設置成透明背景,不然會影響你看到底層布局
this.setBackgroundColor(Color.argb(0, 0, 0, 0));
mImgView = new ImageView(mContext);
mImgView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mImgView.setScaleType(ImageView.ScaleType.FIT_XY);// 填充整個屏幕
mImgView.setImageResource(R.drawable.bg); // 默認背景
addView(mImgView);
}
/**
* 設置推動門背景
*
* @param id
*/
public void setBgImage(int id) {
mImgView.setImageResource(id);
}
/**
* 設置推動門背景
*
* @param drawable
*/
public void setBgImage(Drawable drawable) {
mImgView.setImageDrawable(drawable);
}
/**
* 推動門的動畫
*
* @param startY
* Y方向開始的位置
* @param dy
* Y方向移動的距離
* @param duration
* 時間
*/
public void startBounceAnim(int startY, int dy, int duration) {
mScroller.startScroll(0, startY, 0, dy, duration);
invalidate();// 一定不要忘了寫這句代碼
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 記錄按下的Y抽坐標
mLastDownY = (int) event.getY();
return true;
case MotionEvent.ACTION_MOVE:
mCurryY = (int) event.getY();
mDelY = mCurryY - mLastDownY;
// 只准上滑有效
if (mDelY < 0) {
scrollTo(0, -mDelY);// 跟著移動事件的觸發,不斷的移動
}
break;
case MotionEvent.ACTION_UP:
mCurryY = (int) event.getY();
mDelY = mCurryY - mLastDownY;
if (mDelY < 0) {
if (Math.abs(mDelY) > mScreenHeigh / 2) {
// 向上滑動超過半個屏幕高的時候 開啟向上消失動畫
startBounceAnim(this.getScrollY(), mScreenHeigh, 450);
mCloseFlag = true;
} else {
// 向上滑動未超過半個屏幕高的時候 開啟向下彈動動畫
startBounceAnim(this.getScrollY(), -this.getScrollY(), 1000);
}
}
break;
}
return super.onTouchEvent(event);
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
// 不要忘記更新界面
Log.d(TAG, computeScroll);
postInvalidate();
} else {
if (mCloseFlag) {
this.setVisibility(View.GONE);
}
}
}
}
在onTouchEvent的 MotionEvent.ACTION_MOVE:動作下,注意必須是當前Y值-MotionEvent.ACTION_DOWN的Y小於0,才表示是向上滑動,此時在可以使用scrollTo()來移動View。
scrollTo(X方向位置,Y方法位置),初始化狀態都是(0,0),當向上滑動的距離為10,那麼其實就是10就是Y方向移動的差值,相當於Y方向10移動到了0.
當收離開了屏幕,當移動的距離小於屏幕高的一半,那麼就向下移動,如果移動的距離大於屏幕高的一半,那麼就向上滑動,並且隱藏此View。
在computeScroll方法中,因為在手離開屏幕的時候會調用scroller的開始滾動,那麼在此會根據滾動是否結束,一直不斷的移動屏幕,當然這是invalidate和postInvalidate交互的作用,才可以不斷的刷新和scrollTo()移動View。
在Android中創建菜單項Menu以及獲取手機分辨率的解決方法
在Activity中覆寫下面兩個方法:復制代碼 代碼如下: // 創建菜單 @Override public boo
android 模擬IR輸出
#define IR_HEAD0 0#define IR_HEAD1 1 #define IR_TIME_BASE 2 #define IR_CODE_0
Android 進度條使用詳解及示例代碼
在這裡,總結一下loading進度條的使用簡單總結一下。一、說起進度條,必須說說條形進度條,經常都會使用到嘛,特別是下載文件進度等等,還有像騰訊QQ安裝進度條一樣,有個進
Android學習筆記二十九之SwipeRefreshLayout、RecyclerView和CardView
前面我們介紹了AlertDialog和幾個常用的Dialog,ProgressDialog進度條提示框、DatePickerDialog日期選擇對話框和TimePicke