我正在尝试在代表视频的图像上放置一个“播放”按钮。我希望Android直接支持这种叠加或字形技术,但我找不到任何方法来做到这一点。
(注意这些图像使用位图按各种大小缩放)。
我尝试了几种方法,包括使用LayerDrawable(一个用于图像,一个用于叠加),使用FrameLayout并将前景设置为叠加层,最后,在图像缩放后扩展ImageView并绘制叠加层呈现。
我发现前两种方法,叠加本身与图像一起被缩放是不可接受的。我只想将叠加层放在缩放的图像中心上。
这是我在ImageView扩展中使用的代码:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (overlayBitmap == null) {
return;
}
if (getDrawable() == null) {
return;
}
if (getDrawable().getIntrinsicWidth() == 0
|| getDrawable().getIntrinsicHeight() == 0) {
return;
}
int w = getMeasuredWidth();
int h = getMeasuredHeight();
// Determine the post-scaled size of the overlay
r.set(0, 0, overlayBitmap.getWidth(), overlayBitmap.getHeight());
matrix.mapRect(r);
// Move the overlay to the center
matrix.postTranslate(w / 2 - r.width() / 2, h / 2 - r.height() / 2);
// Draw the overlay
canvas.drawBitmap(overlayBitmap, matrix, paint);
}
这似乎在所有情况下都很有效,但只有一个。这些图像在ListView中开始。选择后,它们会移动到显示区域,并且“播放”按钮在那里并且稳定。但是,在ListView中,图像是不稳定的。有时候叠加层是有的,有时候不是。有时叠加层位于中心,有时则不是。总而言之,叠加大多是缺失或错误的。
它看起来好像这是某种(矩形)失效问题(只是一个疯狂的猜测)。也就是说,当滚动重新绘制时,不会调用ImageView子类onDraw(绘制叠加层)。
当然,当然这也可能是我程序中的一个错误,但操作ImageVew子类并设置叠加层的代码包含得非常好。
有什么想法吗?
编辑我刚发现ViewOverlay看起来很有希望但我必须支持冰淇淋三明治(或最低限度的果冻豆1),这个API需要果冻豆3(4.3)我甚至不拥有Jelly Bean 3兼容平板电脑。
答案 0 :(得分:0)
我建议更换
int w = getMeasuredWidth();
int h = getMeasuredHeight();
使用:
int x = canvas.getWidth();
int y = canvas.getHeight();
因为getMeasuredWidth()和getMeasuredHeight()结果被屏蔽并执行如下操作:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
....
....
Bitmap play = BitmapFactory.decodeResource(getResources(),
R.drawable.play);
int width = play.getWidth();
int height = play.getHeight();
int x = canvas.getWidth()/2 - width/2;
int y = canvas.getHeight()/2 - height/2;
canvas.drawBitmap(play, x, y, new Paint());
}
无论我缩放图像多少,播放按钮都会保持在图像顶部的中心位置
答案 1 :(得分:0)
为什么不使用带有两个孩子的framelayout ..首先是带有缩放图像的图像视图,换行/换行。第二个是文本视图或视图,其背景设置为叠加图像,匹配/匹配布局参数