国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

基于SurfaceView實現可拖動視頻控件

2019-10-22 18:13:12
字體:
來源:轉載
供稿:網友

本文實例為大家分享了基于SurfaceView的可拖動視頻控件,供大家參考,具體內容如下

public class DragSurfaceView extends SurfaceView implements View.OnTouchListener {  protected int screenWidth;  protected int screenHeight;  protected int lastX;  protected int lastY;  private int oriLeft;  private int oriRight;  private int oriTop;  private int oriBottom;  private int dragDirection;  private static final int TOP = 0x15;  private static final int LEFT = 0x16;  private static final int BOTTOM = 0x17;  private static final int RIGHT = 0x18;  private static final int LEFT_TOP = 0x11;  private static final int RIGHT_TOP = 0x12;  private static final int LEFT_BOTTOM = 0x13;  private static final int RIGHT_BOTTOM = 0x14;  private static final int CENTER = 0x19;  private int offset = 20;  /**   * 初始化獲取屏幕寬高   */  protected void initScreenW_H() {    screenHeight = getResources().getDisplayMetrics().heightPixels - 40;    screenWidth = getResources().getDisplayMetrics().widthPixels;    Log.i("DragViewTAG", "DragSurfaceView.initScreenW_H: screenWidth="+screenWidth+", screenHeight="+screenHeight);  }  public DragSurfaceView(Context context) {    super(context);    setOnTouchListener(this);    initScreenW_H();  }  public DragSurfaceView(Context context, AttributeSet attrs) {    super(context, attrs);    setOnTouchListener(this);    initScreenW_H();  }  public DragSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    setOnTouchListener(this);    initScreenW_H();  }  @Override  public boolean onTouch(View v, MotionEvent event) {    int action = event.getAction();    if (action == MotionEvent.ACTION_DOWN) {      oriLeft = v.getLeft();      oriRight = v.getRight();      oriTop = v.getTop();      oriBottom = v.getBottom();      lastY = (int) event.getRawY();      lastX = (int) event.getRawX();      dragDirection = getDirection(v, (int) event.getX(),          (int) event.getY());    }    // 處理拖動事件    delDrag(v, event, action);    if(action==MotionEvent.ACTION_UP){      dragDirection=0;    }    invalidate();    return true;  }  /**   * 獲取觸摸點flag   *   * @param v   * @param x   * @param y   * @return   */  protected int getDirection(View v, int x, int y) {    int left = v.getLeft();    int right = v.getRight();    int bottom = v.getBottom();    int top = v.getTop();    if (x < 40 && y < 40) {      return LEFT_TOP;    }    if (y < 40 && right - left - x < 40) {      return RIGHT_TOP;    }    if (x < 40 && bottom - top - y < 40) {      return LEFT_BOTTOM;    }    if (right - left - x < 40 && bottom - top - y < 40) {      return RIGHT_BOTTOM;    }    if (x < 40) {      return LEFT;    }    if (y < 40) {      return TOP;    }    if (right - left - x < 40) {      return RIGHT;    }    if (bottom - top - y < 40) {      return BOTTOM;    }    return CENTER;  }  /**   * 處理拖動事件   *   * @param v   * @param event   * @param action   */  protected void delDrag(View v, MotionEvent event, int action) {    switch (action) {      case MotionEvent.ACTION_MOVE:        int dx = (int) event.getRawX() - lastX;        int dy = (int) event.getRawY() - lastY;        switch (dragDirection) {          case LEFT: // 左邊緣            left(v, dx);            break;          case RIGHT: // 右邊緣            right(v, dx);            break;          case BOTTOM: // 下邊緣            bottom(v, dy);            break;          case TOP: // 上邊緣            top(v, dy);            break;          case CENTER: // 點擊中心-->>移動            center(v, dx, dy);            break;          case LEFT_BOTTOM: // 左下            left(v, dx);            bottom(v, dy);            break;          case LEFT_TOP: // 左上            left(v, dx);            top(v, dy);            break;          case RIGHT_BOTTOM: // 右下            right(v, dx);            bottom(v, dy);            break;          case RIGHT_TOP: // 右上            right(v, dx);            top(v, dy);            break;          default:            break;        }        v.layout(oriLeft, oriTop, oriRight, oriBottom);//        if (dragDirection != CENTER) {//          v.layout(oriLeft, oriTop, oriRight, oriBottom);//        }        lastX = (int) event.getRawX();        lastY = (int) event.getRawY();        Log.i("DragViewTAG", "DragSurfaceView.delDrag:ACTION_MOVE direction="+dragDirection+", left="+oriLeft+", top="+oriTop+", right="+oriRight+", bottom="+oriBottom);        break;      case MotionEvent.ACTION_UP:        ViewGroup.LayoutParams newLayoutParams = getNewLayoutParams();        if(newLayoutParams!=null){          Log.i("DragViewTAG", "DragSurfaceView.delDrag:ACTION_UP width="+newLayoutParams.width+", height="+newLayoutParams.height);          setLayoutParams(newLayoutParams);        }else {          Log.e("DragViewTAG", "DragSurfaceView.delDrag: 父組件類型?");          v.layout(oriLeft, oriTop, oriRight, oriBottom);        }        break;      default:        break;    }  }  private ViewGroup.LayoutParams getNewLayoutParams(){    if(getLayoutParams() instanceof RelativeLayout.LayoutParams){      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)getLayoutParams( );      lp.leftMargin = oriLeft;      lp.topMargin = oriTop;      lp.width = oriRight-oriLeft;      lp.height = oriBottom-oriTop;      return lp;    }else if(getLayoutParams() instanceof FrameLayout.LayoutParams) {      FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();      lp.leftMargin = oriLeft;      lp.topMargin = oriTop;      lp.width = oriRight - oriLeft;      lp.height = oriBottom - oriTop;      return lp;    }    return null;  }  /**   * 觸摸點為中心->>移動   *   * @param v   * @param dx   * @param dy   */  private void center(View v, int dx, int dy) {    oriLeft += dx;    oriTop += dy;    oriRight += dx;    oriBottom += dy;    Log.i("DragViewTAG", "DragSurfaceView.center: v.left="+v.getLeft()+", v.top="+v.getTop());    if (oriLeft < -offset) {      Log.e("DragViewTAG", "DragSurfaceView.center: 左側越界, left="+oriLeft+", offset="+offset);      oriLeft = -offset;      oriRight = oriLeft + v.getWidth();    }    if (oriRight > screenWidth + offset) {      Log.e("DragViewTAG", "DragSurfaceView.center: 右側越界, right="+oriRight+", screenWidth="+screenWidth+", offset="+offset);      oriRight = screenWidth + offset;      oriLeft = oriRight - v.getWidth();    }    if (oriTop < -offset) {      Log.e("DragViewTAG", "DragSurfaceView.center: 頂部越界, top="+oriTop+", offset="+offset);      oriTop = -offset;      oriBottom = oriTop + v.getHeight();    }    if (oriBottom > screenHeight + offset) {      Log.e("DragViewTAG", "DragSurfaceView.center: 底部越界, bottom="+oriBottom+", screenHeight="+screenHeight+", offset="+offset);      oriBottom = screenHeight + offset;      oriTop = oriBottom - v.getHeight();    }//    v.layout(left, top, right, bottom);  }  /**   * 觸摸點為上邊緣   *   * @param v   * @param dy   */  private void top(View v, int dy) {    oriTop += dy;    if (oriTop < -offset) {      oriTop = -offset;    }    if (oriBottom - oriTop - 2 * offset < 200) {      oriTop = oriBottom - 2 * offset - 200;    }  }  /**   * 觸摸點為下邊緣   *   * @param v   * @param dy   */  private void bottom(View v, int dy) {    oriBottom += dy;    if (oriBottom > screenHeight + offset) {      oriBottom = screenHeight + offset;    }    if (oriBottom - oriTop - 2 * offset < 200) {      oriBottom = 200 + oriTop + 2 * offset;    }  }  /**   * 觸摸點為右邊緣   *   * @param v   * @param dx   */  private void right(View v, int dx) {    oriRight += dx;    if (oriRight > screenWidth + offset) {      oriRight = screenWidth + offset;    }    if (oriRight - oriLeft - 2 * offset < 200) {      oriRight = oriLeft + 2 * offset + 200;    }  }  /**   * 觸摸點為左邊緣   *   * @param v   * @param dx   */  private void left(View v, int dx) {    oriLeft += dx;    if (oriLeft < -offset) {      oriLeft = -offset;    }    if (oriRight - oriLeft - 2 * offset < 200) {      oriLeft = oriRight - 2 * offset - 200;    }  }  /**   * 獲取截取寬度   *   * @return   */  public int getCutWidth() {    return getWidth() - 2 * offset;  }  /**   * 獲取截取高度   *   * @return   */  public int getCutHeight() {    return getHeight() - 2 * offset;  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云梦县| 浦北县| 商丘市| 新野县| 莒南县| 阳西县| 潜江市| 宜宾县| 奉节县| 揭西县| 城口县| 巴林右旗| 含山县| 普洱| 嵊泗县| 沭阳县| 财经| 黄龙县| 盐城市| 措勤县| 高安市| 邯郸县| 安福县| 安康市| 祁连县| 凤阳县| 黄浦区| 大姚县| 平乡县| 正蓝旗| 永安市| 茂名市| 亚东县| 德令哈市| 琼中| 时尚| 麻阳| 秭归县| 古田县| 交城县| 芜湖县|