更改谷歌地图叠加层多图标
在使用Android的Serenity时,我收到的许多请求之一是在海报上显示“监视状态”指示器。 有两种方法可以在Android上执行此操作。
- 使用画布并将覆盖图标绘制到现有位图上
- 使用布局并根据需要覆盖图标。
第一种方法有效,但是将位图永久嵌入其中,这意味着如果要进行切换,则必须重新绘制位图并显示它而不显示它。
第二种方法需要对Serenity中的某些代码进行更多的重构,但事实证明它更加灵活。 通过使用RelativeLayout并嵌入其中的两个ImageView,我可以轻松地切换监视指示器的可见性,并在必要时相当容易地允许将来进行一些叠加。
这是有问题的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/posterIndicatorView"
android:background="@drawable/gallery_item_background" >
<us.nineworlds.serenity.ui.views.SerenityPosterImageView
android:id="@+id/posterImageView"
android:scaleType="fitXY"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
/>
<ImageView android:id="@+id/posterWatchedIndicator"
android:scaleType="fitXY"
android:layout_width="33dp"
android:layout_height="33dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
RelativeLayout允许对视图进行更一般的定位,因此非常适合将观看状态指示器设置为显示在海报的右下角。 为了使用此视图,我需要使用布局充气机来获取视图,然后在其中填充图像。 基本知识在这里:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View galleryCellView = context.getLayoutInflater().inflate(R.layout.poster_indicator_view, null);
VideoContentInfo pi = posterList.get(position);
SerenityPosterImageView mpiv = (SerenityPosterImageView) galleryCellView.findViewById(R.id.posterImageView);
mpiv.setPosterInfo(pi);
mpiv.setBackgroundResource(R.drawable.gallery_item_background);
mpiv.setScaleType(ImageView.ScaleType.FIT_XY);
int width = 0;
int height = 0;
width = ImageUtils.getDPI(130, context);
height = ImageUtils.getDPI(200, context);
if (!MovieBrowserActivity.IS_GRID_VIEW) {
mpiv.setLayoutParams(new RelativeLayout.LayoutParams(width, height));
galleryCellView.setLayoutParams(new SerenityGallery.LayoutParams(width, height));
} else {
width = ImageUtils.getDPI(120, context);
height = ImageUtils.getDPI(180, context);
mpiv.setLayoutParams(new RelativeLayout.LayoutParams(width, height));
galleryCellView.setLayoutParams(new TwoWayAbsListView.LayoutParams(width, height));
}
imageLoader.displayImage(pi.getImageURL(), mpiv);
if (pi.getViewCount() > 0) {
ImageView viewed = (ImageView) galleryCellView.findViewById(R.id.posterWatchedIndicator);
viewed.setImageResource(R.drawable.overlaywatched);
}
return galleryCellView;
}
上面是用于渲染视图的适配器。 它使用Gallery适配器,但也可以在TwoWayGridView中使用。 它将获取要使用的海报,并设置图像视图的布局参数,还将确保RelativeLayout本身设置为与其封装的ImagePoster相同的大小(使用自动换行内容似乎不起作用)预期与RelativeLayout一起使用)。 然后,它检查视频的观看次数是否大于0(如果是),它设置要在海报上使用的叠加位图。 最后,它将新填充的图库视图返回到要显示的图库。
这里的好处是,使用XML布局,可以通过添加必要的标记并在必要时启用它们来轻松添加其他叠加层。 我敢肯定,还有其他方法可以做到这一点,但这似乎效果很好,并且对于将来的扩展能力非常灵活。
翻译自: https://www.javacodegeeks.com/2013/09/adding-overlay-icons-to-imageviews.html
更改谷歌地图叠加层多图标