public class FloatingPopupWindow implementsSurfaceHolder.Callback {//弹窗宽度
private static final int POPUP_WINDOW_WIDTH = 567;//弹窗高度
private static final int POPUP_WINDOW_HEIGHT = 432;privateContext mContext;privatePopupWindow mPopupWindow;privateView mPopContentView;privateRelativeLayout mFloatingLayout;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
MediaPlayer mediaPlayer;private boolean IsDouble = false;private floatlastX;private floatlastY;publicFloatingPopupWindow(Context context) {
mContext=context;
mPopContentView= LayoutInflater.from(mContext).inflate(R.layout.popup_window_floating, null);
mPopupWindow= newPopupWindow(mPopContentView, POPUP_WINDOW_WIDTH, POPUP_WINDOW_HEIGHT);
mFloatingLayout=mPopContentView.findViewById(R.id.floating_layout);
surfaceView=mPopContentView.findViewById(R.id.surface_view);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(this);
mPopContentView.setOnTouchListener(newView.OnTouchListener() {
@Overridepublic booleanonTouch(View v, MotionEvent event) {switch(event.getAction()) {caseMotionEvent.ACTION_DOWN:if (event.getPointerCount() == 1) {
IsDouble= false;
}if (!IsDouble) {
lastX=event.getRawX();
lastY=event.getRawY();
}break;caseMotionEvent.ACTION_MOVE:if (event.getPointerCount() > 1) {
IsDouble= true;
}if (!IsDouble) {int deltaX = (int) (event.getRawX() -lastX);
lastX=event.getRawX();int deltaY = (int) (event.getRawY() -lastY);
lastY=event.getRawY();
mPopupWindow.update(deltaX+ (int) lastX - (POPUP_WINDOW_WIDTH / 2), deltaY + (int) lastY - (POPUP_WINDOW_HEIGHT / 2), -1, -1, true);
}break;
}return true;
}
});
mediaPlayer= newMediaPlayer();
}/*** 是否显示*/
public booleanisShowing() {returnmPopupWindow.isShowing();
}public voidsetPlayPath(String playPath) {try{
mediaPlayer.reset();
mediaPlayer.setDataSource(playPath);
}catch(IOException e) {
e.printStackTrace();
}
}
@Overridepublic voidsurfaceCreated(SurfaceHolder holder) {
Surface surface=holder.getSurface();
mediaPlayer.setSurface(surface);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(newMediaPlayer.OnPreparedListener() {
@Overridepublic voidonPrepared(MediaPlayer mp) {
mp.start();//6.0及之后支持倍速,测试
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.M) {
mp.setPlaybackParams(new PlaybackParams().setSpeed(0.75f));
}
}
});
mediaPlayer.setOnCompletionListener(newMediaPlayer.OnCompletionListener() {
@Overridepublic voidonCompletion(MediaPlayer mp) {
dismiss();
}
});
}
@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, intheight) {
}
@Overridepublic voidsurfaceDestroyed(SurfaceHolder holder) {
}private View mNowView; //当前容器里面装载的View
/*** 添加新View*/
public voidaddView(View view) {
mNowView=view;if (mFloatingLayout != null) {
mFloatingLayout.addView(view);
}
}/*** 获取当前正展现的View*/
publicView getNowView() {returnmNowView;
}/*** 移除全部的子布局*/
public voidremoveAllView() {if (mFloatingLayout != null) {
mFloatingLayout.removeAllViews();
}
}/*** 显示弹出框*/
public voidshow(View view) {if(isShowing()) {return;
}
mPopupWindow.showAtLocation(view, Gravity.NO_GRAVITY,0, 200);
}/*** 隐藏弹出框*/
public voiddismiss() {if (mPopupWindow != null) {if(mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
}
}
}
}