地图选择区域遮罩层自定义控件实现
来源:互联网 发布:大学软件学院排名 编辑:程序博客网 时间: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了。
效果图:
阅读全文
0 0
- 地图选择区域遮罩层自定义控件实现
- 自定义控件实现不规则区域点击事件
- 使用Flash地图控件AnyMap在地图上添加自定义区域
- 百度自定义地图控件
- 百度地图自定义控件
- 选择对话框:自定义组合控件+自定义对话框 实现
- 选择对话框:自定义组合控件+自定义对话框 实现
- 选择对话框:自定义组合控件+自定义对话框 实现
- 用html+jquery实现类似flash的地图区域选择效果
- echarts 地图数据补充 自定义区域
- 一个快速实现自定义地图区域展示及导航的平台:迅达地理
- WPF自定义控件选择
- 自定义ToggleButton选择控件
- Flash地图控件AnyMap中的地图区域提示工具条设置
- Flash地图控件AnyMap中地图区域标签的使用
- DatePicker(日期选择自定义服务器控件)的实现
- 自定义控件 实现文本框输入模仿下拉框选择功能
- 【Android自定义控件】选择输入框的实现
- linux 日常操作记录
- udp接收syslog
- Ajax获取数据渲染到页面
- 合格的菜鸟PHP程序员必知的十个知识结构
- Python模块import
- 地图选择区域遮罩层自定义控件实现
- vm12装centos6.5
- 关于row_number、desek_rank、ntile等函数应用
- USB协议[转]__总结得很好
- php天翼开放平台网页计费
- Pycharm安装
- Jmeter分布式性能测试
- mkdir命令
- 关于稀疏编码和字典学习