Недавно я работаю над программой на android, у меня есть набор изображений, и я извлекаю из них особенности и рисую на них формы в соответствии с их особенностями. И я хочу, чтобы измененные изображения отображались на экране одно за другим, как видео. Я конвертирую каждое изображение в растровое изображение и загружаю его в Canvas, затем рисую форму на Canvas. Я использую ImageView, чтобы показать Canvas и перевести поток в спящий режим на 1 секунду, прежде чем я сделаю еще одну картину.
Но после процесса в представлении будет отображаться только последнее изображение. Я хочу знать, почему и как это решить?
В приведенном ниже коде я пытаюсь сделать это с помощью самоопределяемого представления, результат такой же, как и у 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();
}
}
}
}
я предполагаю, что задержка очень мала, и я не могу помочь, не увидев ваш код.
Извините, я добавляю код прямо сейчас
Я думаю, проблема в том, что когда он устанавливает контент MyView, он ждет 0,5 с. И вы также добавили ожидание 0,5 с в свой OnDraw (), что частично перекрывается. к таймеру окончания Ondraw устанавливается новый контент.
Я хочу, чтобы изображения отображались как видео, поэтому мне нужно немного подождать, как я могу с этим справиться?
о, теперь я понимаю, о чем вы, исправляю код, это не имеет отношения к этой проблеме
как насчет таймера обратного отсчета, такого как этот stackoverflow.com/a/10032406/6142219.
в onFinished нарисуйте следующее изображение / фигуру
может быть хорошая идея, я попробую
Ой спасибо @Deepak kaku, Решаю проблему твоим советом. Большое спасибо
пожалуйста. Я рад, что это помогло вам решить вашу проблему
Благодаря @Deepak kaku я нашел способ решить проблему по ссылке в комментарии. Если я использую основной поток для обновления пользовательского интерфейса, программа задержится, и процесс рисования остановится, а в следующем цикле построенное растровое изображение будет уничтожено и будет создано другое растровое изображение, поэтому ImageView может показывать только последнее изображение. Я решаю проблему, открыв пыльник для обновления пользовательского интерфейса. Прилагаю код ниже:
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);
}
}
рад узнать, что это помогло. :)
прежде чем вы получите отрицательные голоса от сообщества, любезно предоставьте код, который вы написали до сих пор.