Autore Topic: Disegnare su ImageView custom  (Letto 226 volte)

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Disegnare su ImageView custom
« il: 25 Giugno 2015, 18:07:40 CEST »
0
Salve a tutti, sto realizzando una mia ImageView ma ho qualche problema con le coordinate.
Sto cercando di implementare il face detecting con la libreria di Android. Come ImageView estendo una libreria custom trovata online (com.polites.android.GestureImageView), GestureImageView.
Il face detecting mi funziona ma ho le coordinate sballate e non capisco perché. Tra l'altro il cerchio che disegno intorno alle facce esce addirittura dall'ImageView (non dovrebbe esserci clipping?).

Questa è la mia ImageView personalizzata
Codice: [Seleziona]
class MyImageView extends GestureImageView{

        Paint paint;
        static boolean facePainting = false;
        Face[] facce;
        int i = 0;
        int l = 0;                       
        Face faccia;
        PointF tmpPoint = new PointF();
       
        public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
                setWillNotDraw(false);
                paint = new Paint();
                paint.setColor(Color.RED);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(5f);
        }

        @Override
        protected void onDraw(Canvas canvas) {
                super.onDraw(canvas);
               
                if(facePainting && facce != null){
                        while(i < l && facce[i] != null){                                       
                                faccia = facce[i];                               
                                if (faccia.confidence() >= 0.5f){                                       
                                        faccia.getMidPoint(tmpPoint);                                       
                                        canvas.drawCircle(tmpPoint.x, tmpPoint.y, faccia.eyesDistance(), paint);
                                }
                                i++;
                        }
                }
        }

        public void setPaintFaces(boolean b, Face[] faces){
                facePainting = b;
                i = 0;
                if(b){
                        facce = faces;
                        l = facce.length;
                }
        }
}

Questo è l'AsyncTask che uso per avviare il face detecting
Codice: [Seleziona]
        private class FaceRecogniser extends AsyncTask<Void, Void, Face[]>{
                GestureImageView img;
                MenuItem item;
                Bitmap bitmap;

                public FaceRecogniser(GestureImageView img, MenuItem item) {
                        this.img = img;
                        this.item = item;
                }

                @Override
                protected Face[] doInBackground(Void... params) {

                        bitmap = ((BitmapDrawable) img.getDrawable()).getBitmap();
                        FaceDetector faceDetector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), MAX_FACES);       

                        Face[] faces = new Face[MAX_FACES];
                        int n = faceDetector.findFaces(bitmap, faces);
                        if (n == 0) return null;
                        else return faces;
                }

                @Override
                protected void onPostExecute(Face[] result) {
                        super.onPostExecute(result);
                        item.setVisible(true);
                        activity.setProgressBarIndeterminateVisibility(false);
                        if( result == null ) Toast.makeText(getActivity().getApplicationContext(), "Nessun volto trovato", Toast.LENGTH_LONG).show();
                        else{
                                if (imageView == null) imageView = (MyImageView) getView().findViewById(R.id.immagineMostrata);
                                imageView.setPaintFaces(true, result);
                                imageView.redraw();
                        }
                        return;
                }
        }

Per farla breve, uso la libreria Android per calcolare le facce che poi disegno nella onDraw della MyImageView. Solo che qualcosa non va bene nelle coordinate, ma non capisco cosa.
L'unica cosa che mi viene in mente è che il canvas della onDraw si riferisce a tutta l'area del Fragment che ospita l'ImageView, mentre le coordinate che ho io sono relative alla Bitmap dell'ImageView.

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Disegnare su ImageView custom
« Risposta #1 il: 26 Giugno 2015, 18:16:28 CEST »
0
Nessuno che sappia aiutarmi con le coordinate?

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Disegnare su ImageView custom
« Risposta #2 il: 29 Giugno 2015, 17:21:17 CEST »
0
Le coordinate del FaceDetector saranno in pixel immagine...
Le coordinate della drawCircle sono in pixel del Canvas (schermo).
L'ImageView ti ricala l'immagine a seconda dello ScaleType usato.

Ciao.

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Re:Disegnare su ImageView custom
« Risposta #3 il: 30 Giugno 2015, 11:26:30 CEST »
0
Poi ho risolto impostando in un nuovo canvas la bitmap dell'ImageView e disegnando su quella nella onDraw.