我是Android新手,让我先告诉你我想要实现的目标。使用套接字,我每50毫秒从我的电脑网络摄像头发送图片。在Android应用程序中,我创建了扩展View的显示器。我已将此视图添加到FrameLayout。并行线程正在从服务器应用程序(桌面)接收图像并刷新我的显示。
在这张图片上,我想显示一些刷新的加速度计数据......好吧它设置为SENSOR_DELAY_FASTEST。所以我还创建了另一个扩展View的显示,我也将它添加到另一个FrameLayout。现在我将main.xml设置为与FrameLayouts重叠..
我从桌面应用程序获取图像,我正在绘制加速度计数据,并且它重叠,但问题是......它在闪烁。有人可以帮忙吗?或者提出一些建议......正如我已经指出的那样,我是Android新手。
谢谢..
答案 0 :(得分: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()方法。这迫使重绘。