地图选择区域遮罩层自定义控件实现

来源:互联网 发布:大学软件学院排名 编辑:程序博客网 时间:2024/06/01 11:28

项目中用到了地图遮罩层,显示被用户选中的区域。在网上发现了不错的自定义控件,记录下来以备后用。来源:http://blog.csdn.net/desireyaoo/article/details/53642009。

直接贴代码:


public class MaskPierceView extends View {    private static final String TAG = "MaskPierceView";    private Bitmap mSrcRect;    private Bitmap mDstCircle;    private int mScreenWidth;   // 屏幕的宽    private int mScreenHeight;  // 屏幕的高    private int mPiercedX, mPiercedY;    private int mPiercedRadius;    public MaskPierceView(Context context) {        this(context, null);    }    public MaskPierceView(Context context, AttributeSet attrs) {        super(context, attrs);        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(                ViewGroup.LayoutParams.MATCH_PARENT,                ViewGroup.LayoutParams.MATCH_PARENT);        setLayoutParams(layoutParams);        if (mScreenWidth == 0) {            DisplayMetrics dm = getResources().getDisplayMetrics();            mScreenWidth = dm.widthPixels;            mScreenHeight = dm.heightPixels;        }    }    /**     * @param mPiercedX      镂空的圆心坐标     * @param mPiercedY      镂空的圆心坐标     * @param mPiercedRadius 镂空的圆半径     */    public void setPiercePosition(int mPiercedX, int mPiercedY, int mPiercedRadius) {        this.mPiercedX = mPiercedX;        this.mPiercedY = mPiercedY;        this.mPiercedRadius = mPiercedRadius;    }    @Override    protected void onDraw(Canvas canvas) {        mSrcRect = makeSrcRect();        mDstCircle = makeDstCircle();        Paint paint = new Paint();        paint.setFilterBitmap(false);        canvas.saveLayer(0, 0, mScreenWidth, mScreenHeight, null,                Canvas.MATRIX_SAVE_FLAG |                        Canvas.CLIP_SAVE_FLAG |                        Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |                        Canvas.FULL_COLOR_LAYER_SAVE_FLAG |                        Canvas.CLIP_TO_LAYER_SAVE_FLAG);        canvas.drawBitmap(mDstCircle, 0, 0, paint);        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));        paint.setAlpha(160);        canvas.drawBitmap(mSrcRect, 0, 0, paint);        paint.setXfermode(null);        canvas.saveLayer(0, 0, mScreenWidth, mScreenHeight, null,                Canvas.MATRIX_SAVE_FLAG |                        Canvas.CLIP_SAVE_FLAG |                        Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |                        Canvas.FULL_COLOR_LAYER_SAVE_FLAG |                        Canvas.CLIP_TO_LAYER_SAVE_FLAG);        paint.setAlpha(255);        //canvas.drawBitmap(createPromptBitmap(), mPiercedX + mPiercedRadius, mPiercedY + mPiercedRadius, paint);    }    /**     * 创建镂空层圆形形状     * @return     */    private Bitmap makeDstCircle() {        Bitmap bm = Bitmap.createBitmap(mScreenWidth, mScreenHeight, Bitmap.Config.ARGB_8888);        Canvas canvcs = new Canvas(bm);        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);        paint.setColor(Color.WHITE);        canvcs.drawCircle(mPiercedX, mPiercedY, mPiercedRadius, paint);        return bm;    }    /**     * 创建遮罩层形状     *     * @return     */    private Bitmap makeSrcRect() {        Bitmap bm = Bitmap.createBitmap(mScreenWidth, mScreenHeight, Bitmap.Config.ARGB_8888);        Canvas canvcs = new Canvas(bm);        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);        paint.setColor(Color.BLACK);        canvcs.drawRect(new RectF(0, 0, mScreenWidth, mScreenHeight), paint);        return bm;    }    /**     * 创建提示提示信息文字图片的bitmap     *     * @return     */    private Bitmap createPromptBitmap() {        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_marka);        int width = bitmap.getWidth();        int height = bitmap.getHeight();        DisplayMetrics dm = getResources().getDisplayMetrics();  //获取屏幕密度        float realScale = 1.0f / dm.density;  //恢复到实际像素的缩放        float settingScale = realScale;        if (realScale * width > mScreenWidth / 2) {            settingScale = 0.8f * mScreenWidth / width;        } else if (realScale * height > mScreenHeight) {            settingScale = 0.8f * mScreenHeight / height;        }        // 取得想要缩放的matrix参数        Matrix matrix = new Matrix();        matrix.postScale(settingScale, settingScale);//      得到新的图片        Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);        return newBitmap;    }}

使用方法:

在xml中使用控件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <include layout="@layout/title"/>    <FrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <com.baidu.mapapi.map.MapView            android:id="@+id/bmapView"            android:layout_width="fill_parent"            android:layout_height="fill_parent" />        <LinearLayout            android:layout_width="match_parent"            android:layout_height="match_parent"            android:gravity="center"            >            <com.ttgg.fabu.mView.MaskPierceView                android:id="@+id/mpv_overlay"                android:layout_width="match_parent"                android:layout_height="match_parent"                />        </LinearLayout>    </FrameLayout></LinearLayout>

在代码中设置遮罩层的镂空区域坐标及半径:

mpv_overlay.setPiercePosition(530,800,450);

这样就ok了。

效果图: