package com.bosi.chineseclass.views; import com.bosi.chineseclass.BSApplication; import com.bosi.chineseclass.R; import com.bosi.chineseclass.utils.DataTools; import com.bosi.chineseclass.views.paint.ColorPickerDialog; import com.bosi.chineseclass.views.paint.ColorPickerDialog.OnColorChangedListener; import com.bosi.chineseclass.views.paint.PaintView; import com.firstpeople.paintpad.interfaces.PaintViewCallBack; import com.lidroid.xutils.ViewUtils; import com.lidroid.xutils.view.annotation.ViewInject; import com.lidroid.xutils.view.annotation.event.OnClick; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.WindowManager; public class PaintPadWindow { private boolean isAdded = false; // 是否已增加悬浮窗 private static WindowManager wm; private static WindowManager.LayoutParams params; View mBaseView; @ViewInject(R.id.paintpad_redo) private View mViewRedo; @ViewInject(R.id.paintpad_undo) private View mViewUndo; @ViewInject(R.id.paintpad_changecolor) private View mChageColor; @ViewInject(R.id.paintpad_size) private View mViewSize; @OnClick(R.id.paintpad_redo) public void actionRedo(View mView){ mPaintView.redo(); } @OnClick(R.id.paintpad_undo) public void actionUndo(View mView){ mPaintView.undo(); } ColorPickerDialog mColorPickDialog ; @OnClick(R.id.paintpad_changecolor) public void actionColor(View mView){ mColorPickDialog.show(); } private PaintView mPaintView; Bitmap mBitmap ; public void onDestroy(){ if(mBitmap!=null&&!mBitmap.isRecycled()){ mBitmap.recycle(); } } private void initBaseView(){ mPaintView = (PaintView) mBaseView.findViewById(R.id.paintdialog_paintview); mPaintView.setPenSize(16); mPaintView.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.iv_bgdict)); mColorPickDialog = new ColorPickerDialog(mContext, new OnColorChangedListener(){ @Override public void colorChanged(int color) { mPaintView.setPenColor(color); } },mPaintView.getBackGroundColor()); mPaintView.setCallBack(new PaintViewCallBack() { @Override public void onTouchDown() { } @Override public void onHasDraw() { } }); } public void dismissView(){ if(wm!=null && mBaseView!=null&&isAdded){ wm.removeView(mBaseView); isAdded = false; } } private Context mContext; public PaintPadWindow(Context mContext){ this.mContext = mContext; mBaseView = View.inflate(mContext, R.layout.layout_paintpad, null); ViewUtils.inject(this, mBaseView); initBaseView(); } public void showPaintPad(){ createFloatView(); } /** * 创建悬浮窗 */ public void createFloatView() { if(wm ==null){ wm = (WindowManager) BSApplication.getInstance() .getSystemService(Context.WINDOW_SERVICE); params = new WindowManager.LayoutParams(); // 设置window type params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; /* * 如果设置为params.type = WindowManager.LayoutParams.TYPE_PHONE; * 那么优先级会降低一些, 即拉下通知栏不可见 */ params.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明 // 设置Window flag params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; /* * 下面的flags属性的效果形同“锁定”。 * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。 wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE; */ // 设置悬浮窗的长得宽 params.width = DataTools.dip2px(mContext,200); params.height = DataTools.dip2px(mContext, 200); } if(isAdded){ wm.removeView(mBaseView); } mBaseView.setOnTouchListener(new OnTouchListener() { int lastX, lastY; int paramX, paramY; public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); paramX = params.x; paramY = params.y; break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; params.x = paramX + dx; params.y = paramY + dy; // 更新悬浮窗位置 wm.updateViewLayout(mBaseView, params); break; } return true; } }); wm.addView(mBaseView, params); isAdded = true; } }