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

首頁 > 系統(tǒng) > Android > 正文

基于SurfaceView實現(xiàn)可拖動視頻控件

2019-12-12 01:02:37
字體:
供稿:網(wǎng)友

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

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: 左側(cè)越界, left="+oriLeft+", offset="+offset);   oriLeft = -offset;   oriRight = oriLeft + v.getWidth();  }  if (oriRight > screenWidth + offset) {   Log.e("DragViewTAG", "DragSurfaceView.center: 右側(cè)越界, 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; }}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 北辰区| 宁陵县| 临泽县| 营山县| 丰都县| 南丰县| 阿拉善右旗| 东乡族自治县| 江源县| 永平县| 平谷区| 吉林市| 五河县| 同江市| 娱乐| 旺苍县| 红原县| 潞西市| 濮阳市| 崇义县| 融水| 揭阳市| 铁岭县| 壤塘县| 仁怀市| 临猗县| 吉安市| 凤台县| 临汾市| 永昌县| 商南县| 泾川县| 札达县| 略阳县| 汉源县| 东宁县| 杭锦后旗| 宜宾县| 巴彦淖尔市| 彭阳县| 建水县|