編輯:關於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。
在Activity中覆寫下面兩個方法:復制代碼 代碼如下: // 創建菜單 @Override public boo
#define IR_HEAD0 0#define IR_HEAD1 1 #define IR_TIME_BASE 2 #define IR_CODE_0
在這裡,總結一下loading進度條的使用簡單總結一下。一、說起進度條,必須說說條形進度條,經常都會使用到嘛,特別是下載文件進度等等,還有像騰訊QQ安裝進度條一樣,有個進
前面我們介紹了AlertDialog和幾個常用的Dialog,ProgressDialog進度條提示框、DatePickerDialog日期選擇對話框和TimePicke