2010-08-16 116 views
0

我是Android新手,首先让我告诉你我想实现的目标。使用套接字,我每隔50毫秒从计算机的网络摄像头发送图片。在Android应用程序中,我创建了扩展视图的显示器。我已将此视图添加到FrameLayout。并行线程正在从服务器应用程序(桌面)接收图像并刷新显示。Android重叠视图

在此图像上,我想显示一些刷新每个...的加速度计数据,它被设置为SENSOR_DELAY_FASTEST。所以我还创建了另一个扩展视图的显示,并且我将它添加到另一个FrameLayout。现在我设置我的main.xml重叠这些FrameLayouts ..

我得到我的图像从桌面应用程序,我绘制加速计数据,它重叠,但问题是..它闪烁。谁能帮忙?或者提出一些建议。正如我指出的,我是Android新手。

谢谢..

+0

如果您可以包含您在活动中使用的部分代码 - 尤其是用您的日期更新视图的代码,这将会很有帮助。 – QRohlf 2010-08-16 22:33:14

回答

0

这是一个简单的覆盖绘制图像。 - 以及需要重绘的方法。

@Override 
protected void onDraw(Canvas canvas){ 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); 
    paint.setARGB(10, 255, 255, 255); 
    if(Core.pic != null) { 
     canvas.drawBitmap(Core.pic, 0, 0, paint); 
    }  
} 

这是一个不同的类,对于重绘调用时,新的图像可用:与

protected static volatile Bitmap pic; 
    public static void refreshDisplay(Bitmap img){ 
    pic = img; 
    if(cameraDisplay != null) { 
     try{ 
      cameraDisplay.invalidate(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

这里是一个线程类,准备端口每50ms:

 while(running){ 

     opt.inDither = true; 
     opt.inPreferredConfig = Bitmap.Config.ARGB_8888; 

     if(in != null){ 
      byte[] recieve = new byte[7000]; 
      try { 
       in.read(recieve, 0, 7000); 
       Core.pic = BitmapFactory.decodeByteArray(recieve, 0, 7000, opt);  
      } catch (IOException e) {} 
     } 
     try { 
      sleep(50); 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    } 

仅此一项工作正常。当我重叠这个视图时,它会闪烁。在类似的方式,我读加速度数据,并绘制它:

public void onAccelerationChanged(float x, float y, float z) { 
    if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){ 
     velocityBars.DrawVelocity(x, -z); 
    } 
    else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ 
     velocityBars.DrawVelocity(y, -z); 
    } 
} 

velocityBars是我的变量,它是我的自定义视图类型。此方法DrawVelocity调用invalidate()方法。这强制重绘。