需求是将带alpha png显示为水印,显示在最上层,且不遮挡任何内容,且没有activity,只有Service.
当前使用的是Service中创建一个SurfaceView,在SurfaceView中通过bitmap来显示png.
Service.java
if (mShowFlag == false) {
Log.d(TAG, "start to show floatingwindows!");
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
if (null != windowManager) {
Log.d(TAG, "start init layout!");
mShowFlag = true;
mLayoutParams = new WindowManager.LayoutParams();
mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mLayoutParams.format = PixelFormat.RGBA_8888;
mLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
mLayoutParams.x = WaterMarkInfo.GetX();
mLayoutParams.y = WaterMarkInfo.GetY();
mLayoutParams.width = WaterMarkInfo.GetW();
mLayoutParams.height = WaterMarkInfo.GetH();
Log.d(TAG,"x:"+mLayoutParams.x+",y:"+mLayoutParams.y+",width:"+mLayoutParams.width+",height:"+mLayoutParams.height + ",alpha:" + mLayoutParams.alpha);
mImageView = new WaterMarkImageView(getApplicationContext());
windowManager.addView(mImageView, mLayoutParams);
Handler mWindowHandle = new Handler();
mWindowHandle.postDelayed(new Runnable() {
@Override
public void run() {
if (null != mImageView) {
Log.d(TAG, "call mImage.run()");
mImageView.run();
}
}
}, 1000);
}
}
WaterMarkImageView.java
public WaterMarkImageView(Context context) {
super(context);
Log.d(TAG, "enter ImageSurfaceView, mFilePath:" + mFilePath);
mSurfaceHolder = getHolder();
mSurfaceHolder.addCallback(this);
setZOrderOnTop(true);
setZOrderMediaOverlay(true);
setBackgroundColor(Color.TRANSPARENT);
}
private void drawImageFile(Canvas canvas, String file){
Log.d(TAG, "enter drawImageFile mFilePath:" + file);
File f = new File(file);
if (!f.exists()) {
Log.e(TAG, "mFilePath is not exist!");
return;
}
Bitmap bitmap = null;
try{
bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
if(bitmap != null){
Log.d(TAG, "start to draw image file!");
canvas.drawBitmap(bitmap, 0, 0, null);
} else {
Log.e(TAG, "BitmapFactory.decodeStream return is null!");
}
mSurfaceHolder.unlockCanvasAndPost(canvas);
}catch(Exception ex){
Log.e(TAG, ex.getMessage());
}finally{
if(bitmap!=null){
bitmap.recycle();
}
}
}
当前可以显示,但是没有透明效果,图片矩形总是自带背景色?纳闷。。。
android 精通bitmap、ServiceView的大神帮忙瞧瞧
Anybody else?