亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android Moveview滑屏移動視圖類完整實例

2020-04-11 11:47:48
字體:
來源:轉載
供稿:網友

本文示例所述程序為一個Android Moveview移動視圖類。其主要實現主屏左右滑屏拖動功能,并適時顯示拖動時候屏幕的顯示情況,該代碼中還包括完整的邏輯。其完整代碼如下:

import android.study.shift.ItemView;import android.study.shift.MainView;import android.study.shift.Moveview;import android.content.Context;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.View.MeasureSpec;public class Moveview extends ViewGroup{ private final static int TOUCH_STATE_REST = 0; private final static int TOUCH_STATE_MOVING = 1; private final static int MOVE_TO_LEFT = 1; //private final static int MOVE_TO_RIGHT = 2; private final static int MOVE_TO_REST = 0; public final static int MAIN = 0; public final static int LEFT = 1; public final static int RIGHT = 2; private int touch_state = TOUCH_STATE_REST; private int move_state = MOVE_TO_REST; private int now_state = MAIN; private final float WIDTH_RATE = 0.18f; private MainView main_show_view; private ItemView left_show_view; private int min_distance = 30;//此處只是初始化為30 ,其實不起作用 private int screen_w; private int screen_h; private int move_x_v; private boolean isAimationMoving = false; private Handler mHandler = new Handler() { public void handleMessage(Message msg) {//處理消息  synchronized (Moveview.this) {//同步  isAimationMoving = true;  int move_change = (int) (screen_w * WIDTH_RATE / 5);  int left = main_show_view.getView().getLeft();  if (msg.what == 1) {//主屏在向右拖曳。。。   move(move_change + left);//參數為拖出來后主屏的坐標。  }  if (msg.what == 11) {   isAimationMoving = false;   moveToLeft(false); //滿足可以顯示的要求開始顯示,false只是一個判定條件,以區別按鈕起的效果  }  if (msg.what == 2) {//代表主屏向左在拖曳。。。   move(-1 * move_change + left);  }  if (msg.what == 12) {   isAimationMoving = false;   //moveToRight(false);  }  if (msg.what == 0) {   if (now_state == LEFT) {//如果現在已經顯示左邊   move(-1 * move_x_v);//那么還原成主屏   } else {   move(move_x_v);   }  }  if (msg.what == 10) {   isAimationMoving = false;   moveToMain(false);  }  } } }; public Moveview(Context context) { super(context); } public Moveview(Context context, AttributeSet attrs) { super(context, attrs); } public Moveview(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void initView() { if (main_show_view == null) {  main_show_view = new MainView(this.getContext(), this);  left_show_view = new ItemView(this.getContext());  //right_show_view = new ItemView(this.getContext(), "aaa"); } this.addView(left_show_view.getView()); //this.addView(right_show_view.getView()); this.addView(main_show_view.getView()); } public void initContent() { } public void move(int start) {//本函數顯示拖動的時候屏幕的顯示情況。 int left = main_show_view.getView().getLeft();//left代表主屏左邊緣的位置坐標。 if (now_state == MAIN) {  if (left > 0) {//如果屏幕的左邊被移向右,則left變成正數  if (move_state != MOVE_TO_LEFT) {   move_state = MOVE_TO_LEFT;  }  left_show_view.getView().setVisibility(View.VISIBLE);//設置左邊可見  //right_show_view.getView().setVisibility(View.GONE);  } //else if (left < 0) {//如果屏幕的左邊被移向左,則left變成負數  //if (move_state != MOVE_TO_RIGHT) {  // move_state = MOVE_TO_RIGHT;  //}  //right_show_view.getView().setVisibility(View.VISIBLE);  //left_show_view.getView().setVisibility(View.GONE);  //}   else {  move_state = MOVE_TO_REST;  }  main_show_view.getView().layout(start, 0, start + screen_w,   screen_h);//參數依次為左、上、右、下。 } else {  left = (int) (screen_w * WIDTH_RATE);//left為左邊應該留出的控件空間,或者主屏左邊應該在的位置  if (now_state == RIGHT) {  left = -1 * left;//若狀態是在右邊空出來,則主屏的左邊為負數  }  left = left + start;  main_show_view.getView().layout(left, 0, left + screen_w, screen_h); } } @Override protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { if (move_state == MOVE_TO_REST) {  if (now_state == MAIN) {  int w = (int) (screen_w * WIDTH_RATE);//留下預定的寬度,顯示各個view的參數設置。  main_show_view.getView().layout(0, 0, screen_w, screen_h);  left_show_view.getView().layout(0, 0, w, screen_h);  } else if (now_state == LEFT) {  moveToLeft(false);  } else {  } } } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { main_show_view.getView().measure(widthMeasureSpec, heightMeasureSpec); left_show_view.getView().measure(MeasureSpec.UNSPECIFIED,//unspecified為未指定的  heightMeasureSpec); left_show_view.setWidth((int) (screen_w * WIDTH_RATE));//設置view寬度 super.onMeasure(widthMeasureSpec, heightMeasureSpec);//調用父類的構造函數 } private int start_x; private int start_y; private boolean isMoved; public boolean dispatchTouchEvent(MotionEvent ev) {//分發觸摸消息事件 if (isAimationMoving) {  return super.dispatchTouchEvent(ev); } else {  int action = ev.getAction();  float x = ev.getX();  float y = ev.getY();  switch (action) {  case MotionEvent.ACTION_DOWN:  super.dispatchTouchEvent(ev);  start_y = (int) y;  move_x_v = 0;  if (this.touch_state == TOUCH_STATE_REST) {   this.touch_state = TOUCH_STATE_MOVING;   start_x = (int) x;   isMoved = false;   move_state = MOVE_TO_REST;  }  break;  case MotionEvent.ACTION_MOVE:  int last_y = (int) y;  int last_x = (int) x;  super.dispatchTouchEvent(ev);  if (!isMoved) {   if (Math.abs(last_y - start_y) > Math.abs(last_x - start_x)) {//如果Y上面移動的距離大于X上面移動的距離。   super.onTouchEvent(ev);   return true;   } else {//X移動距離大于Y   if (Math.abs(last_x - start_x) > 5) {//X移動距離大于5就被認為移動了    isMoved = true;   }   }  }  if (isMoved) {   if (this.touch_state == TOUCH_STATE_MOVING) {   if (Math.abs(last_x - start_x) > 10) {//如果移動的X距離大于10    int left = main_show_view.getView().getLeft();    Log.d("msg", "left:" + left);    Log.d("msg", "x:" + last_x);    isMoved = true;    int move_x = last_x - start_x;    if (move_x > 0 && now_state == LEFT) {//方向正確的移動才算是移動的狀態    isMoved = false;    break;    }    if (move_x < 0 && now_state == RIGHT) {//如果現在在顯示右邊,那么再向右移就不反應。    isMoved = false;    break;    }    if (move_x < 0 && now_state ==MAIN){//如果現在在主屏,向右移動也是無效的    isMoved = false;    break;    }    if (move_x > 234 && now_state ==MAIN){    isMoved = true;//設置為true那么移動還是發生了,break之后還是會在ACTIONUP中起作用    break;//break之后不會執行下面的move()語句,    }    if (move_x < -234 && now_state ==LEFT){    isMoved = true;    break;    }    move(move_x);//以移動的距離為參數調用move()實現移動的動態顯示   }   }   return false;  }  break;  case MotionEvent.ACTION_UP://  if (this.touch_state == TOUCH_STATE_MOVING) {   if (isMoved) {   last_x = (int) x;   if (Math.abs(last_x - start_x) > min_distance) {//    if (now_state == MAIN) {    if (move_state == MOVE_TO_LEFT) {     this.moveToLeft(false);    }    } else {    this.moveToMain(false);    }   } else {  //    if (now_state == MAIN) {    this.moveToMain(false);    }    if (now_state == LEFT) {    this.moveToLeft(false);    }    if (now_state == RIGHT) {    //this.moveToRight(false);    }   }   move_state = MOVE_TO_REST;   }  else {   super.dispatchTouchEvent(ev);   this.touch_state = TOUCH_STATE_REST;   return false;//   }  }  super.onTouchEvent(ev);  this.touch_state = TOUCH_STATE_REST;  break;  }  return true; } } public boolean getIsMoved() { return isMoved; } public void moveToLeft(boolean b) { if (!b) {  int move_x = (int) (screen_w * WIDTH_RATE);  left_show_view.getView().layout(0, 0, screen_w, screen_h);  //right_show_view.getView().layout(move_x, 0, move_x * 2, screen_h);  main_show_view.getView().layout(move_x, 0, move_x + screen_w,   screen_h);  now_state = LEFT;//為什么現在又把now_state賦值為left? }//  else {//else以及括號中的語句都是為原來的按鈕準備的。。。//  mHandler.postDelayed(new Runnable() {//一個新的可運行的函數////  @Override//  public void run() {//   int move_change = (int) (screen_w * WIDTH_RATE / 5);//五分之一要顯示的寬度//   int left = (int) (screen_w * WIDTH_RATE - main_show_view//    .getView().getLeft());//getleft()返回的是主屏左邊緣離左邊的距離//   Message msg = new Message();//   if (left > move_change) {//括號里面不懂,起什么作用?//   msg.what = 1;//   mHandler.sendMessage(msg);//   mHandler.postDelayed(this, 10);//又調用自己,基本上非要是小于關系//   } else {//   msg.what = 11;//   mHandler.sendMessage(msg);//   mHandler.removeCallbacks(this);//   }//  }//  }, 0);// } } public void moveToMain(boolean b) { if (!b) {  //right_show_view.getView().setVisibility(View.VISIBLE);  left_show_view.getView().setVisibility(View.VISIBLE);  int w = (int) (screen_w * WIDTH_RATE);  main_show_view.getView().layout(0, 0, screen_w, screen_h);  left_show_view.getView().layout(0, 0, w, screen_h);  now_state = MAIN; } } public void initScreenSize(int w, int h) { this.screen_w = w; this.screen_h = h; Log.d("screen", "screen_w:" + w); this.setKeepScreenOn(true); min_distance = (int) (screen_w / 12.0);//min_distance在這里又被初始化為屏幕的一個比例大小 initView(); initContent(); moveToMain(false); } public int getNowState() { return this.now_state; }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久婷婷| 国产精品第七影院| 动漫精品一区二区| 日韩精品极品在线观看| 欧美激情2020午夜免费观看| 奇米成人av国产一区二区三区| 欧美色另类天堂2015| 色午夜这里只有精品| 精品久久中文字幕久久av| 国内精品美女av在线播放| 亚洲精品久久久久中文字幕欢迎你| 亚洲国产日韩欧美在线图片| 在线观看日韩专区| 成人黄色免费网站在线观看| 亚洲另类xxxx| 欧美性猛交xxxxx免费看| 亚洲精品视频在线观看视频| 精品亚洲夜色av98在线观看| 久久精品视频中文字幕| 中文字幕亚洲情99在线| 国产精品老女人视频| 久久久精品电影| 亚洲精品视频在线观看视频| 91网在线免费观看| 国产成人啪精品视频免费网| 欧美激情视频在线免费观看 欧美视频免费一| 日韩av在线免费观看| 国产精品中文字幕在线观看| 国产精品久久久久久一区二区| 国产精品极品美女粉嫩高清在线| 色中色综合影院手机版在线观看| 欧美亚洲国产视频小说| 欧美日韩精品在线观看| 国产精品久久久久久久午夜| 亚洲成人av片在线观看| 国产欧美一区二区三区久久人妖| 亚洲va欧美va国产综合久久| 日韩成人xxxx| 精品国产精品三级精品av网址| 国产成人涩涩涩视频在线观看| 亚洲三级黄色在线观看| 国产精品视频专区| 亚洲人成网站免费播放| 国内精品久久影院| 国产精品久久二区| 97久久久免费福利网址| 成人字幕网zmw| 欧美在线视频免费观看| 久久精品国产2020观看福利| www.美女亚洲精品| 亚洲视频999| 日韩在线观看免费网站| 久久亚洲私人国产精品va| 久久中文字幕一区| 国产精品视频导航| 欧美性受xxx| 另类少妇人与禽zozz0性伦| 97精品国产97久久久久久免费| 668精品在线视频| 97人洗澡人人免费公开视频碰碰碰| 国产午夜精品免费一区二区三区| 91欧美精品午夜性色福利在线| 久久九九有精品国产23| 日韩精品极品毛片系列视频| 91国产中文字幕| 57pao成人永久免费视频| 97精品一区二区三区| 尤物yw午夜国产精品视频明星| 亚洲天堂成人在线视频| 日韩欧美黄色动漫| 欧美激情一二区| 91在线精品视频| 国产精品吊钟奶在线| 国产一区二区三区在线看| 91久久国产精品91久久性色| 伊人久久久久久久久久久| 日韩av电影免费观看高清| 亚洲自拍小视频| 国产99久久精品一区二区 夜夜躁日日躁| 欧美日韩成人黄色| 日韩亚洲国产中文字幕| 岛国精品视频在线播放| 日韩电影中文字幕av| 国产精品视频一区二区高潮| 国产精品美女久久久久久免费| 欧美激情精品久久久久久黑人| 国内自拍欧美激情| 亚洲最新av在线| 中文字幕亚洲图片| 欧美国产精品va在线观看| 成人精品视频久久久久| 亚洲精品视频久久| 另类图片亚洲另类| 91精品国产99| 欧美日韩国产丝袜另类| 色中色综合影院手机版在线观看| 欧美极品美女视频网站在线观看免费| 久久精品中文字幕一区| 国产精品99久久久久久www| 成人激情电影一区二区| 久久99精品久久久久久青青91| 欧美激情第99页| 欧美精品videofree1080p| xvideos亚洲| 亚洲japanese制服美女| 精品偷拍各种wc美女嘘嘘| 国内精品久久久久久| 精品国偷自产在线视频| 亚洲成人av片在线观看| 欧美国产亚洲精品久久久8v| 黑人巨大精品欧美一区二区三区| www.xxxx精品| 国产精品主播视频| 亚洲人成免费电影| 日韩av影院在线观看| 国产欧美日韩免费| 日韩一区二区av| 成人夜晚看av| 日韩成人av网址| 国内免费久久久久久久久久久| 国产欧美一区二区三区四区| 欧美一级黑人aaaaaaa做受| 中文字幕视频在线免费欧美日韩综合在线看| 日本欧美中文字幕| 国产一区二区三区18| 久久久久久有精品国产| 久久精品美女视频网站| 欧美专区在线观看| 日韩免费在线播放| 欧美一二三视频| 日韩美女激情视频| 色樱桃影院亚洲精品影院| 日韩精品视频免费在线观看| 亚洲欧美日韩久久久久久| 97在线观看免费高清| 久久久久这里只有精品| 国产成人精品网站| 久久久人成影片一区二区三区观看| 日产日韩在线亚洲欧美| 国产婷婷成人久久av免费高清| 日韩免费观看av| 亚洲精品综合久久中文字幕| 久久99精品久久久久久琪琪| 两个人的视频www国产精品| 亚洲精品视频网上网址在线观看| 日韩在线视频导航| 神马久久久久久| 国产精品国产自产拍高清av水多| 日韩成人av网址| 国产日韩欧美视频在线| 国产成人精品亚洲精品| 亚洲一区二区三区香蕉| 日韩a**站在线观看| 中文字幕在线亚洲| 456亚洲影院| 久久国产精品网站| 38少妇精品导航| 欧美激情亚洲视频| 国产亚洲精品美女| 欧美激情xxxx| 韩剧1988在线观看免费完整版| 91色视频在线观看| 久久成人在线视频| 欧美专区在线观看|