小球控制器SurfaceView中遇到的问题:跳转至其他fragment无法取消显示控制器

package com.jyu.company.activity;

import com.jyu.company.R;
import com.jyu.company.tools.MathUtils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.PorterDuff.Mode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;

public class DirectionView extends SurfaceView implements Callback {

 private SurfaceHolder mHolder;
 private Paint mPaint;
 public Point mRockerPosition; // 摇杆位置
 private Point mCtrlPoint;// 摇杆起始位置
 private int mRudderRadius = 25;// 摇杆半径
 private int mWheelRadius = 80;// 摇杆活动范围半径
 private int batmapHW = 160;
 private int batmap2HW = 40;
 int isHide = 0;
 Bitmap bitmap, bitmap2;
 float scale;
 private SingleRudderListener listener = null; // 事件回调接口
 public static final int ACTION_RUDDER = 1, ACTION_ATTACK_DEVICEMOVE = 2,
   ACTION_STOP = 3, ACTION_ATTACK_CAMERAMOVE = 4;

 // public DirectionView(Context context, AttributeSet attrs) {
 // super(context, attrs);
 // }

 public DirectionView(Context context, AttributeSet attrs) {
  super(context);
  this.setKeepScreenOn(true);
  scale = context.getResources().getDisplayMetrics().density;
  mRudderRadius = dip2px(15);// 摇杆半径
  mWheelRadius = dip2px(45);// 摇杆活动范围半径
  mCtrlPoint = new Point((mRudderRadius + mWheelRadius),
    (mRudderRadius + mWheelRadius));// 摇杆起始位置
  batmapHW = (mWheelRadius + mRudderRadius) * 2;
  batmap2HW = mRudderRadius * 2;
  mHolder = getHolder();
  mHolder.addCallback(this);
  mPaint = new Paint();
  mPaint.setAntiAlias(true);
  setFocusable(true);
  setFocusableInTouchMode(true);
  mRockerPosition = new Point(mCtrlPoint);
  setZOrderOnTop(true);
  mHolder.setFormat(PixelFormat.TRANSPARENT);// 设置背景透明
  bitmap = BitmapFactory.decodeResource(getResources(),
    R.drawable.audiocontrol);
  bitmap = Bitmap.createScaledBitmap(bitmap, batmapHW, batmapHW, false);
  bitmap2 = BitmapFactory
    .decodeResource(getResources(), R.drawable.point);
  bitmap2 = Bitmap.createScaledBitmap(bitmap2, batmap2HW, batmap2HW,
    false);
 }

 // 获取屏幕的宽度,高度和密度以及dp / px
 public void getDisplayMetrics() {

 }

 public int dip2px(float dpValue) {
  return (int) (dpValue * scale + 0.5f);
 }

 // 回调接口
 public interface SingleRudderListener {
  void onSteeringWheelChanged(int action, int angle);
 }

 // 设置回调接口
 public void setSingleRudderListener(SingleRudderListener rockerListener) {
  listener = rockerListener;
 }

 int len;

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  try {
   if (isHide == 0) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
     len = MathUtils.getLength(mCtrlPoint.x, mCtrlPoint.y,
       event.getX(), event.getY());
     // 如果屏幕接触点不在摇杆挥动范围内,则不处理
     if (len > mWheelRadius) {
      return true;
     }
     break;
    case MotionEvent.ACTION_MOVE:
     len = MathUtils.getLength(mCtrlPoint.x, mCtrlPoint.y,
       event.getX(), event.getY());
     if (len <= mWheelRadius) {
      // 如果手指在摇杆活动范围内,则摇杆处于手指触摸位置
      mRockerPosition.set((int) event.getX(),
        (int) event.getY());
     } else {
      // 设置摇杆位置,使其处于手指触摸方向的 摇杆活动范围边缘
      mRockerPosition = MathUtils.getBorderPoint(
        mCtrlPoint,
        new Point((int) event.getX(), (int) event
          .getY()), mWheelRadius);
     }
     if (listener != null) {
      float radian = MathUtils.getRadian(
        mCtrlPoint,
        new Point((int) event.getX(), (int) event
          .getY()));
      listener.onSteeringWheelChanged(ACTION_RUDDER,
        getAngleCouvert(radian));
     }
     break;
    case MotionEvent.ACTION_UP:
     mRockerPosition = new Point(mCtrlPoint);
     if (listener != null) {
      listener.onSteeringWheelChanged(ACTION_STOP, 0);
     }
     break;
    }
    Canvas_OK();
    Thread.sleep(60);
   } else {
    Thread.sleep(200);
   }
  } catch (Exception e) {

  }
  return true;
 }

 public void singleRockerUp() {
  mRockerPosition = new Point(mCtrlPoint);
  listener.onSteeringWheelChanged(ACTION_STOP, 0);
 }

 // 获取摇杆偏移角度 0-360°
 private int getAngleCouvert(float radian) {
  int tmp = (int) Math.round(radian / Math.PI * 180);
  if (tmp < 0) {
   return -tmp;
  } else {
   return 180 + (180 - tmp);
  }
 }

 public void surfaceCreated(SurfaceHolder holder) {
  Canvas_OK();
 }

 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {

 }

 public void surfaceDestroyed(SurfaceHolder holder) {

 }

 // 设置是否隐藏
 public void Hided(int opt) {
  isHide = opt;
  Canvas_OK();
 }

 public void setHided(int opt) {
  isHide = opt;
 }

 /**
  * 返回圆盘是否隐藏
  *
  * @return
  */
 public int getIsHided() {
  return isHide;
 }

 // 绘制图像
 public void Canvas_OK() {
  Canvas canvas = null;
  try {
   if (isHide == 0) {
    canvas = mHolder.lockCanvas();
    canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);// 清除屏幕
    canvas.drawBitmap(bitmap, mCtrlPoint.x - mWheelRadius
      - mRudderRadius, mCtrlPoint.y - mWheelRadius
      - mRudderRadius, mPaint);
    canvas.drawBitmap(bitmap2, mRockerPosition.x - mRudderRadius,
      mRockerPosition.y - mRudderRadius, mPaint);
   } else {
    canvas = mHolder.lockCanvas();
    canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);// 清除屏幕
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (canvas != null) {
    mHolder.unlockCanvasAndPost(canvas);
   }
  }
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值