Нарисуйте конкретные фигуры на каждом изображении и покажите их один за другим. - PullRequest
0 голосов
/ 21 мая 2018

Недавно я работаю над программой на android, у меня есть набор картинок, и я извлекаю из них особенность и рисую на них фигуры в соответствии с их особенностями.И я хочу, чтобы измененное изображение показывалось один за другим, как видео.Я конвертирую каждое изображение в растровое изображение и загружаю его в Canvas, затем рисую форму на Canvas.Я использую ImageView, чтобы показать Canvas и заставить нить спать 1 с, прежде чем я сделаю еще одну картину.Но после процесса, вид показывает только последнюю картинку.Я хочу знать, почему и как это решить?Приведенный ниже код показывает, что я пытаюсь сделать это, используя самоопределенный View, результат такой же, как 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();
            }
        }
    }
}

1 Ответ

0 голосов
/ 22 мая 2018

Благодаря @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);
}

}

...