Xamarin Android ImageView在快速更新时闪烁黑色

时间:2014-07-18 04:51:54

标签: android imageview xamarin

所以我有一个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)));

3 个答案:

答案 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();
            });
        };