Android 在每个图像上绘制特定的形状,并逐一显示
最近我在android上开发一个程序,我有一组图片,我从中提取特征并根据特征在上面绘制形状。我希望修改后的图片像视频一样一个接一个地显示在视图上。我将每张图片转换为位图并将其加载到Android 在每个图像上绘制特定的形状,并逐一显示,android,canvas,view,imageview,computer-vision,Android,Canvas,View,Imageview,Computer Vision,最近我在android上开发一个程序,我有一组图片,我从中提取特征并根据特征在上面绘制形状。我希望修改后的图片像视频一样一个接一个地显示在视图上。我将每张图片转换为位图并将其加载到画布中,然后在画布上绘制形状。我使用ImageView显示Canvas,并使线程休眠1s,然后再进行另一次绘制。 但在处理之后,视图仅显示最后一张图片。我想知道为什么以及如何解决它? 下面的代码是我尝试使用自定义视图来实现的,结果与ImageView.setImageBitmap相同,只是显示了最后一张图片 publi
画布
中,然后在画布
上绘制形状。我使用ImageView
显示Canvas
,并使线程休眠1s,然后再进行另一次绘制。
但在处理之后,视图仅显示最后一张图片。我想知道为什么以及如何解决它?
下面的代码是我尝试使用自定义视图来实现的,结果与ImageView.setImageBitmap相同,只是显示了最后一张图片
public class MainActivity extends AppCompatActivity {
final String TAG="TEST";
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate: ");
setContentView(new Myview(this));
}
class Myview extends View{
private int width;
private int height;
private Bitmap bitmap;
private Canvas canvasBit;
private Paint paintCircle;
private Paint paintRect;
private Paint paint;
private int bimapWidth;
private int bitmapHeight;
public Myview (Context context) {
super(context);
paintCircle = new Paint();
paintCircle.setColor(Color.YELLOW);
paintCircle.setStyle(Paint.Style.FILL);
paintCircle.setAntiAlias(true);
paintRect = new Paint();
paintRect.setColor(Color.GREEN);
paint = new Paint();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
bitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
canvasBit=new Canvas(bitmap);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
String path="car4/img";
DecimalFormat d=new DecimalFormat("0000");
int count=0;
try {
String[] l= new String[0];
l = getAssets().list(path);
count=l.length;
for(int i=1;i<=5;i++)
{
String file=path+"/"+d.format(i)+".jpg";
InputStream in=getAssets().open(file);
Bitmap bm= BitmapFactory.decodeStream(in);
canvas.drawBitmap(bm,0,0,paint);
canvas.drawCircle(10,10,50,paintCircle);
Thread.sleep(500);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public类MainActivity扩展了AppCompatActivity{
最终字符串TAG=“TEST”;
ImageView iv;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i(标记“onCreate:”);
setContentView(新Myview(this));
}
类Myview扩展了视图{
私有整数宽度;
私人内部高度;
私有位图;
私人画布;
私人涂料界;
私人油漆;
私人油漆;
私有int-bimapWidth;
私有int位图高度;
公共Myview(上下文){
超级(上下文);
paintCircle=新油漆();
paintCircle.setColor(颜色:黄色);
paintCircle.setStyle(Paint.Style.FILL);
paintCircle.setAntiAlias(真);
paintRect=新油漆();
paintRect.setColor(Color.GREEN);
油漆=新油漆();
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
超级测量(宽度测量、高度测量);
宽度=getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec);
高度=getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec);
设置测量尺寸(宽度、高度);
bitmap=bitmap.createBitmap(宽度、高度、bitmap.Config.ARGB_8888);
canvasBit=新画布(位图);
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
字符串路径=“car4/img”;
DecimalFormat d=新的DecimalFormat(“0000”);
整数计数=0;
试一试{
字符串[]l=新字符串[0];
l=getAssets().list(路径);
计数=l.长度;
对于(int i=1;i,感谢@Deepak kaku,我通过评论中的链接找到了解决问题的方法。
如果我使用主线程更新UI,程序将延迟,绘制过程将停止,在下一个循环中,构建的位图将被销毁,并构建另一个位图,因此ImageView只能显示最后一张图片。
我通过打开另一个线程来更新UI来解决这个问题
我附上以下代码:
package com.example.xwa.test;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
public class MainActivity extends AppCompatActivity {
private Bitmap bm;
private Canvas canvasBit;
private Paint paintRect;
private Paint paint;
private Handler handler = new Handler();
private Runnable runnable;
final String TAG="TESTTEST";
String path;
int count;
TextView tv;
int i=1;
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
UIinital();
startdraw();
} catch (IOException e) {
e.printStackTrace();
}
}
void UIinital() throws IOException {
paintRect = new Paint();
paintRect.setColor(Color.YELLOW);
paint = new Paint();
path="car4/img";
String[] l=getAssets().list(path);
count=l.length;
iv=findViewById(R.id.imageView);
tv=findViewById(R.id.textView);
}
void startdraw()
{
runnable=new Runnable(){
public void run() {
try {
handler.postDelayed(this, 1000);
DecimalFormat d=new DecimalFormat("0000");
String file=path+"/"+d.format(i)+".jpg";
InputStream in=getAssets().open(file);
bm= BitmapFactory.decodeStream(in);
iv.setImageBitmap(bm);
Log.i(TAG, "run: "+new Integer(i).toString());
tv.setText("result="+new Integer(i).toString()+"\n");
i++;
if(i==count)
handler.removeCallbacks(runnable);
} catch (Exception e) {
e.printStackTrace();
}
}
};
handler.postDelayed(runnable, 0);
}
protected void onStop() {
super.onStop();
handler.removeCallbacks(runnable);
}
}在您获得社区的否决票之前,请提供您迄今为止编写的代码。我猜延迟很小,我无法不看您的代码。很抱歉,我现在添加代码。我想,问题是当它设置内容MyView时,等待0.5秒。您还在OnDraw()中添加了0.5秒的等待时间,哪种重叠。在Ondraw的计时器完成时,设置了新的内容。我想让图片像视频一样显示,所以我必须让它等待一小段时间,我如何处理它?很高兴知道它有帮助。:)