Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android java中在imageview上绘制多个点_Java_Android_Canvas_Firebase Mlkit - Fatal编程技术网

如何在android java中在imageview上绘制多个点

如何在android java中在imageview上绘制多个点,java,android,canvas,firebase-mlkit,Java,Android,Canvas,Firebase Mlkit,我正在建立一个眼睛检测android项目,我想使用画布绘制概率,我正在使用Firebase ML工具包定制模型 我只成功地得出了一点。 我想画点(从我的tflite模型中得到的概率) 我尝试使用这些功能: private void useInferenceResult(float[] probabilities) throws IOException { // [START mlkit_use_inference_result] String[] result=new Stri

我正在建立一个眼睛检测android项目,我想使用画布绘制概率,我正在使用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);
}
private void use推论结果(float[]概率)引发IOException异常{
//[启动mlkit\u使用\u推断\u结果]
字符串[]结果=新字符串[80];
浮动x=0;
浮动y=0;
ArrayList listpoint=新的ArrayList();
对于(int i=0;i对于(int j=0;jSimple 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();
    }
}
公共类CiclesImageView扩展了AppCompatImageView{
private ArrayList theDots=new ArrayList();
私有油漆=新油漆(油漆.防油漆别名标志);
public CirclesImageView(上下文){
超级(上下文);
setOnTouchListener(新的OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
if(event.getAction()==MotionEvent.ACTION\u向下)
drawDot(新的PointF(event.getX(),event.getY());
返回performClick();
}
});
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
油漆。设置颜色(颜色。黑色);
绘制.设置样式(绘制.样式.笔划);
用于(点F点:点)画布.画圈(点x,点y,5,画图);
}
公共无效绘图点(点F点){
添加(点点);
使无效();
}
}

此imageView的使用方式与任何其他imageView的使用方式相同,除非您触摸它,否则它会在自身上画一个圆。如果您想画自己的圆,则drawDot(pointF)是公共的。

我通过更改一些代码行来解决问题,我在顶部声明这些变量,并在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);
}
BitmapFactory.Options myOptions;
帆布;
位图可变位图;
位图工作位图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_open=findviewbyd(R.id.btn_open);
image2=findViewById(R.id.imageView);
myOptions=新的BitmapFactory.Options();
位图=BitmapFactory.decodeResource(getResources(),
R.drawable.image000880,myOptions);
油漆=新油漆();
paint.setAntiAlias(真);
油漆。设置颜色(颜色。白色);
workingBitmap=Bitmap.createBitmap(位图);
mutableBitmap=workingBitmap.copy(Bitmap.Config.ARGB_8888,true);
画布=新画布(可变位图);
专用空心绘图点(ImageView ImageView、浮点x、浮点y、int raduis){
myOptions.inDither=true;
myOptions.inScaled=false;
myOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//重要
myOptions.inpurgable=true;
//ArrayList=新建ArrayList();
画布.画圈(x,y,raduis,paint);
imageView=(imageView)findViewById(R.id.imageView);
imageView.setAdjustViewBounds(true);
setImageBitmap(可变位图);
}

希望此解决方案能帮助其他有同样情况的人

如果您删除代码注释,则更有可能获得帮助谢谢,我已更新了我的代码您的意思是我应该创建此类吗?并在MainActivity中从此类创建对象?是的。您熟悉创建对象的后代吗?如果您的意思是创建描述大量的对象“面向对象编程”,答案当然是肯定的问题是函数
rect.contains(x,y)
将int作为参数的类型,但点应该是float,而不是int,什么AttributeSet???@abdou_dev如果在代码中使用该类,则AttributeSet为null。如果该类是从XML文件膨胀而来,Android将填充AttributeSet。我有时使用Android Studio预览,任何视图类型都应该有上下文在构造函数中设置一个属性来确保预览效果。当我遇到float和int的问题时,我通常会围绕它进行类型转换。如果我有一个float x并且需要一个int x,那么快速的解决方案是将float类型转换为int(int)x。