WindowsManager+SurfaceView 显示水印

需求是将带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?