首页 > 系统 > Android > 正文

基于SurfaceView实现可拖动视频控件

2019-12-12 01:02:37
字体:
来源:转载
供稿:网友

本文实例为大家分享了基于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; }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表