我正在创建一个将播放来自网络的视频文件的活动。那部分运作良好。
在视频中的某些点,我需要在视频上叠加视图。视图将具有基本的 UI 元素,主要是按钮和一些文本(无法预先确定)。
我希望覆盖看起来好像是视频的一部分,而不一定是本机 UI 元素。我遇到的主要问题是,由于视频质量有些低,它有很多“阻塞”,而 UI 元素的绘制非常清晰。
谁能建议如何向 UI 元素添加“阻止”?
我的想法是我可以覆盖draw()
父元素并以某种方式使用过滤器来创建效果,但我将如何做到这一点超出了我的范围。
我正在创建一个将播放来自网络的视频文件的活动。那部分运作良好。
在视频中的某些点,我需要在视频上叠加视图。视图将具有基本的 UI 元素,主要是按钮和一些文本(无法预先确定)。
我希望覆盖看起来好像是视频的一部分,而不一定是本机 UI 元素。我遇到的主要问题是,由于视频质量有些低,它有很多“阻塞”,而 UI 元素的绘制非常清晰。
谁能建议如何向 UI 元素添加“阻止”?
我的想法是我可以覆盖draw()
父元素并以某种方式使用过滤器来创建效果,但我将如何做到这一点超出了我的范围。
最后,我找到了一个适合我的解决方案。它涉及将视图作为位图抓取,将其缩小,然后使用将其拉伸回原始大小。这给出了块状、像素化的外观。我可以通过更改缩放时的大小差异来精确控制块的获取方式。
确保this.setDrawingCacheEnabled(true);
在构造函数中设置。
private static final float RESAMPLE_QUALITY = 0.66f; // less than 1, lower = worse quality
public void draw(Canvas canvas) {
super.draw(canvas);
Bitmap bitmap_old = this.getDrawingCache();
Bitmap bitmap_new = Bitmap.createScaledBitmap(bitmap_old, Math.round(bitmap_old.getWidth() * RESAMPLE_QUALITY), Math.round(bitmap_old.getHeight() * RESAMPLE_QUALITY), true);
Rect from = new Rect(0, 0, bitmap_new.getWidth(), bitmap_new.getHeight());
RectF to = new RectF(0, 0, bitmap_old.getWidth(), bitmap_old.getHeight());
canvas.drawBitmap(bitmap_new, from, to, null);
}