簡體   English   中英

如何在Android Java中的ImageView上繪制多個點

[英]How to draw multiple points on imageview in android java

我正在設置一個眼睛檢測android項目,我想使用Canvas繪制概率,我正在將Firebase ML套件用於自定義模型,我僅成功繪制了一點。 我想畫點(我擁有的tflite模型的概率)。

我嘗試使用這些功能:

private void useInferenceResult(float[] probabilities) throws IOException {

    // [START mlkit_use_inference_result]
    String[] result=new String[80];
    float x=0;
    float y=0;
    ArrayList<Point> listpoint= new ArrayList<Point>();

    for (int i = 0; i < probabilities.length; i++) {

        Log.i("MLKit", String.format("%1.4f", probabilities[i]));
        x=probabilities[i];
        y=probabilities[i+1];
        Point p=new Point(x,y);
        i=i+1;

        p.setX(x);
        p.setY(y);

        Log.i("Information1 ","valeur 1 "+p.getX());

        listpoint.add(p);
            Log.i("Information2 ","valeur 2 "+p.getX());
    }

    for(int j=0;j<listpoint.size();j++){

        Log.e("Information","work");
        Log.e("Resultat","point_"+j+"("+listpoint.get(j).getX()+", "+listpoint.get(j).getY()+")");
        float xx=listpoint.get(j).getX()*100;
        float yy=listpoint.get(j).getY()*100;
        drawpoint(image2,0.20958422f * 100,0.6274962f * 100,1);
        drawpoint(image2, 0.20460524f * 100,0.6708223f * 100,1);

    }
}

//drawpoint function
private void drawpoint(ImageView imageView,float x,float y, int raduis){

    BitmapFactory.Options myOptions = new BitmapFactory.Options();
    myOptions.inDither = true;
    myOptions.inScaled = false;
    myOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;// important
    myOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.imgg,myOptions);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.WHITE);

    Bitmap workingBitmap = Bitmap.createBitmap(bitmap);
    Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true);

    Canvas canvas = new Canvas(mutableBitmap);
    canvas.drawCircle(x,y, raduis, paint);

    imageView = (ImageView)findViewById(R.id.imageView);
    imageView.setAdjustViewBounds(true);
    imageView.setImageBitmap(mutableBitmap);
}

但僅得出一點,我沒有得到任何結果。 如何在imageView上繪制多個點?

我通過更改一些代碼行解決了我的問題,在頂部聲明了這些變量,並在setContentView之后創建了對象:

BitmapFactory.Options myOptions;
Canvas canvas;
Bitmap mutableBitmap;
Bitmap workingBitmap;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_open= findViewById(R.id.btn_open);
    image2= findViewById(R.id.imageView);
    myOptions = new BitmapFactory.Options();
    bitmap = BitmapFactory.decodeResource(getResources(), 
    R.drawable.image000880,myOptions);
    paint= new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.WHITE);

    workingBitmap = Bitmap.createBitmap(bitmap);
    mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true);
    canvas = new Canvas(mutableBitmap);

   private void drawpoint(ImageView imageView,float x,float y, int raduis){
    myOptions.inDither = true;
    myOptions.inScaled = false;
    myOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;// important
    myOptions.inPurgeable = true;
//  ArrayList<Point> list= new ArrayList<>();
    canvas.drawCircle(x,y, raduis, paint);
    imageView = (ImageView)findViewById(R.id.imageView);
    imageView.setAdjustViewBounds(true);
    imageView.setImageBitmap(mutableBitmap);
}

希望此解決方案可以幫助其他情況相同的人

簡單的ImageView后代類。

public class CiclesImageView extends AppCompatImageView {
    private ArrayList<PointF> theDots = new ArrayList<>();
    private Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);

    public CirclesImageView(Context context) {
        super(context);
        setOnTouchListener(new OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN)
            drawDot(new PointF(event.getX(),event.getY()));
            return performClick();
          }
        });
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        for (PointF pt:theDots)canvas.drawCircle(pt.x,pt.y,5,paint);
    }

    public void drawDot(PointF dotPoint){
        theDots.add(dotPoint);
        invalidate();
    }
}

使用此imageView的方式與使用任何其他imageView的方式相同,不同之處在於,如果觸摸它,它會在其自身上畫一個圓。 如果要繪制自己的圓,則drawDot(pointF)是公共的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM