所以我有一个imageview,我使用setImageBitmap(pic)大约30fps作为视频流的形式,并且imageview图像(不是屏幕的其余部分)闪烁黑色或每隔几秒消失。我需要添加或禁用imageview的特殊设置,以使其不会变为空白或闪烁吗?我尝试设置imageview图像,布局的背景图像,VideoView,并且每当我更新背景图像时,所有这些都会闪烁黑色。任何修复?
图像宽约320px,我不确定多高,低于320 tho。
代码似乎并不是必需的,但这就是我正在做的事情('imageStream'是ImageView):
RunOnUiThread (() => StreamActivity.imageStream.SetImageBitmap(pic));
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageViewStream"
android:focusable="false"
android:focusableInTouchMode="false"
android:soundEffectsEnabled="false"
android:clickable="false"
android:longClickable="false"
android:hapticFeedbackEnabled="false"
android:adjustViewBounds="true"
android:cropToPadding="true" />
编辑:我尝试设置软件图层类型,硬件图层类型,并将背景颜色设置为Color.Argb(1,0,0,0) 这些都没有效果。
编辑:我似乎通过将应用程序设置为以硬件加速运行,以及将图像视图和布局作为硬件加速来修复它。 然后我将图像设置代码更改为 Bitmap tempBitmap = Bitmap.CreateBitmap(pic.Width, pic.Height, Bitmap.Config.Rgb565);
Canvas tempCanvas = new Canvas(tempBitmap); // then draw to the Canvas.
tempCanvas.DrawBitmap(pic, 0, 0, null);
RunOnUiThread (() => StreamActivity.imageStream.SetImageDrawable(new BitmapDrawable(tempBitmap)));
答案 0 :(得分:0)
我认为这是因为RunOnUiThread。
如果只想更改imageview jst中的图像使用
ImageView.setBackgroundResource(R.drawable.thumbs down);
答案 1 :(得分:0)
我似乎已经通过将应用程序设置为以硬件加速运行来修复它,并且还将图像视图和布局设置为硬件加速。 然后我将图像设置代码更改为
Bitmap tempBitmap = Bitmap.CreateBitmap(pic.Width, pic.Height, Bitmap.Config.Rgb565);
Canvas tempCanvas = new Canvas(tempBitmap); // then draw to the Canvas.
tempCanvas.DrawBitmap(pic, 0, 0, null);
RunOnUiThread (() => StreamActivity.imageStream.SetImageDrawable(new BitmapDrawable(tempBitmap)));
和我的OnCreate()
imageStream.SetLayerType(LayerType.Hardware, null);
frameLayout1.SetLayerType(LayerType.Hardware, null);
在我的androidmanifest中:
<application
android:label="MyName"
android:hardwareAccelerated="true"/>
答案 2 :(得分:0)
我通过从UI线程的位图创建BitmapDrawable,然后在UI线程上调用SetImageDrawable,然后处理BitmapDrawable来解决这个问题。
我不知道为什么会这样,但我想在创建drawable时会有一些开销,这会减轻绘图程序的负担。
我正在使用Xamarin,但你明白了(eventArgs.Frame是一个Android Bitmap):
_stream.NewFrame += (object sender, NewFrameEventArgs eventArgs) =>
{
var bd = new BitmapDrawable(eventArgs.Frame);
(Context as Activity).RunOnUiThread(() =>
{
SetImageDrawable(bd);
bd.Dispose();
});
};