项目中用到了地图遮罩层,显示被用户选中的区域。在网上发现了不错的自定义控件,记录下来以备后用。来源: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;}@Overrideprotected 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"/><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"><com.ttgg.fabu.mView.MaskPierceViewandroid:id="@+id/mpv_overlay"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout></FrameLayout></LinearLayout>

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

mpv_overlay.setPiercePosition(530,800,450);

这样就ok了。

效果图:

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

  1. 驾驶舱地图 渐变遮罩层 CSS

    驾驶舱地图 渐变遮罩层 <div class="mask"><div class="left-mask"></div>< ...

  2. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十一)地图遮罩层的实现

    前面的章节主要针对地图表现层进行讲解.通常来说,简单的游戏光有它就足够了:但是为了达到更加真实的光影效果,模拟真实的虚拟世界,我们还得继续在地图上下大工夫.本节将就如何实现地图中的遮罩层,即物体对角色 ...

  3. 百度地图之 添加遮罩层 去除百度地图logo

    效果图: 步骤: 1,申请百度密钥,步骤不再赘述 2,引入百度地图:pubilc/index.html中引入 <script type="text/javascript" s ...

  4. C#实现Winform自定义半透明遮罩层

    在网页中通过div+css实现半透明效果不难,今天我们看看一种在winfrom中实现的方法: 效果图如下,正常时: 显示遮罩层时: 自定义遮罩层控件的源码如下: View Code using Sys ...

  5. Winform应用程序实现通用遮罩层二

    之前先后发表过:<Winform应用程序实现通用遮罩层>.<Winform应用程序实现通用消息窗口>,这两款遮罩层其实都是基于弹出窗口的,今天为大家分享一个比较简单但界面相对友 ...

  6. 天地图 添加遮罩层效果

    天地图引入就不写了,这里写引入最基本的地图后,怎样变成遮罩效果 1,思路:外部是蓝色遮罩层,中间镂空为新乡市地图.通过天地图demo修改为自己想要的效果. 2,阿里云 下载新乡市四周边界坐标 对数据进 ...

  7. 百度地图添加遮罩js

    /** * 添加遮罩:遮盖非目标区域,若points为空数组则遮罩整个区域 * @param points为Point对象集合 *@date 20171212 */ function addMask( ...

  8. Echarts中使用bmap作为底图,添加行政划区遮罩层

    前段时间需要做一个地图,由于思路错误等各种原因,走走停停也搞了大半个月.....记录以下心路历程,希望能帮助到有需要的同学们... 要求的效果大概是这个样子的: 第一反应就是,拿bmap作为底图,然后 ...

  9. android高德SDK,Marker的zIndex导致的遮罩层问题解决

    一.问题描述 最近项目接到了一个遮罩层需求,效果图如下 凭感觉会觉得不难,遮罩层+遮罩层之上的元素,通过高德自己的api进行图层排序就可以. 假如用Polygon来绘制遮罩层,那么测试代码如下: va ...

最新文章

  1. python 获取用户ip_Python爬虫教程:你还在苦苦拉票吗?刷票小程序案例原理剖析!...
  2. 怎么学python-如何高效学 Python?
  3. [学习笔记]树链剖分
  4. 本地连接虚拟机数据库或远程数据库
  5. latex的资料ftp
  6. Linux排序命令sort笔记
  7. 调光设备术语:调光曲线(转)
  8. html字居右垂直设置,css文字水平垂直居中怎么设置?
  9. matlab mtime,matlab中的视频分析工具箱 提供matlab中的视频分析工具 - 下载 - 搜珍网...
  10. python treeview显示多列_Python Gtk TreeView列数据显示
  11. 【ElasticSearch】Es 源码之 NetworkModule 源码解读
  12. SoftGrid教程系列
  13. 【转】Java多线程编程(十)-并发编程原理(分布式环境中并发问题)
  14. 845透色android10,骁龙845旗舰宝刀不老 升级安卓10焕然一新
  15. Exchange 2007 474 问题解决方法
  16. php正则表达式小括號,php使用正則表達式提取字符串中尖括號、小括號、中括號、大括號中的字符串...
  17. 计算机网络与应用在线作业,北航《计算机网络与应用》在线作业一15秋满分答案...
  18. 华硕a豆安装ubuntu14.04系统开启wifi
  19. 关于虚拟主机那点事儿
  20. limbo模拟器运行linux,Limbowin10镜像下载|Limbo模拟器win10镜像 可上网版_最火软件站...

热门文章

  1. 职业类型-ENTJ型
  2. 如何用微信编辑器排版出美观的图文消息
  3. 什么是TDK?什么是网站的TDK?扫(myself的)盲
  4. Model Inversion Attacks that Exploit Confidence Informati on and Basic Countermeasures 阅读心得
  5. ffmpeg example演示教程 -AudioDecode
  6. win10自动聚焦无法更换壁纸
  7. 2022蓝帽杯初赛wp
  8. java怎么处理黑白bmp_Android JNI处理图片实现黑白滤镜的方法
  9. 猫喜欢吃鱼,可猫不会游泳,鱼喜欢吃蚯蚓,可鱼不会上岸;上帝给了你很多诱惑,却不会让你轻易实现!...
  10. 微信群聊消失找回方法介绍