19

Próbuję zezwolić użytkownikowi na dotknięcie obrazu, a następnie w zasadzie okrężna lupa pokaże, że pozwoli użytkownikowi lepiej wybrać określony obszar na obrazie. Kiedy użytkownik zwolni dotyk, powiększona część zniknie. Jest on używany w kilku aplikacjach do edycji zdjęć i próbuję implementować moją własną wersję. Kod, który mam poniżej, powiększa okrągłą część obrazu, ale nie usuwa ani nie usuwa powiększenia po zwolnieniu palca. Aktualnie ustawiam mapę bitową na płótnie przy użyciu canvas = new Canvas(bitMap);, a następnie ustawię obraz przy użyciu takenPhoto.setImageBitmap(bitMap); Nie jestem pewien, czy robię to we właściwy sposób. Kod onTouch znajduje się poniżej:Android - Jak powiększać/powiększać część obrazu na okrągło?

zoomPos = new PointF(0,0); 
     takenPhoto.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       int action = event.getAction(); 
        switch (action) { 
         case MotionEvent.ACTION_DOWN: 
          zoomPos.x = event.getX(); 
          zoomPos.y = event.getY(); 
          matrix.reset(); 
          matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
          shader.setLocalMatrix(matrix); 
          canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); 
          takenPhoto.invalidate(); 
          break; 
         case MotionEvent.ACTION_MOVE: 
          zoomPos.x = event.getX(); 
          zoomPos.y = event.getY(); 
          matrix.reset(); 
          matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
          canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); 
          takenPhoto.invalidate(); 
          break; 
         case MotionEvent.ACTION_UP: 
          //clear zoom here? 

          break; 
         case MotionEvent.ACTION_CANCEL: 
          break; 
         default: 
          break; 
      } 
        return true; 
      } 
      }); 
+0

ja nie wiem, czy to dobrze rozumiem, ale pytasz jak wyczyścić efekt powiększenia na obrazie? Dlaczego nie zapisać oryginalnego obrazu w oddzielnej bitmapie. Gdy użytkownik używa zoomu i nadszedł czas, aby pozbyć się efektu lupy, użyj oryginalnej bitmapy i ponownie narysuj ją na płótnie, a tym samym usuń obraz za pomocą zoomu. –

+0

Nie Nie otrzymuję okręgu powiększającego nad widokiem obrazu. czy mógłbyś podzielić się czymś więcej lub klasą, gdzie działa kod? –

+0

Mam również potrzebę powiększania obrazu w przezroczystej ramce nakładki, która znajduje się w środku galerii, dzięki czemu zawsze obraz przechodzi przez to, co jest powiększane, sugeruj – Ravi

Odpowiedz

16

Dostosowując kod, udało mi się uzyskać następujące podejście do pracy.

W funkcji onTouch, ustawić punkt globalnego określania, gdzie użytkownik dotknął i ustawić wartość logiczną, aby wskazać, czy powiększanie jest aktualnie aktywny czy nie:

@Override 
public boolean onTouch(View view, MotionEvent event) { 

    int action = event.getAction(); 

    zoomPos.x = event.getX(); 
    zoomPos.y = event.getY(); 

    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
    case MotionEvent.ACTION_MOVE: 
     zooming = true; 
     this.invalidate(); 
     break; 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_CANCEL: 
     zooming = false; 
     this.invalidate(); 
     break; 

    default: 
     break; 
    } 

    return true; 
} 

Następnie w metodzie OnDraw, ty użyć kodu do rysowania powiększony w części:

@Override 
protected void onDraw(Canvas canvas) { 

    super.onDraw(canvas); 

    if (zooming) { 
     matrix.reset(); 
     matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
     mPaint.getShader().setLocalMatrix(matrix); 

     canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint); 
    } 
} 

Zauważ, że dla modułu cieniującego, użyłem modułu cieniującego jako bitmapy opisaną here, który został stworzony z:

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); 
mShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP); 

mPaint = new Paint(); 
mPaint.setShader(mShader); 
+0

hej, dzięki, człowiek to zdecydowanie pomaga –

+0

@ qzikl, proszę, możesz rozwinąć trochę więcej ? lub jeśli możesz napisać gdzie zadeklarować metodę onDraw i jaka jest tutaj matryca? –

+0

hej dzięki za powyższy kod. Czy jest jakiś sposób, aby pokazać powiększony powiększony widok w jakiejś poprawionej pozycji? –

6

Najlepszym sposobem na cofnięcie zmian w obrazie będzie ponowne załadowanie obrazu z pliku źródłowego. Lub alternatywnie, zachowaj oryginalną zmienną macierzy kopii przed rozpoczęciem transformacji, podczas ładowania oryginalnej macierzy przez MotionEvent.ACTION_UP.

0

Można go zaimplementować za pomocą niestandardowego widoku obrazu, Utwórz kod klasy CodesforMagnifierImageView.java w pakiecie. Można zobaczyć kod dla danej klasy w CodesforMagnifier.java i po prostu użyć następującego kodu w pliku arkusza zamiast za ImageView

<com.yourpackage.CodesforMagnifierImageView 
    android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/your image" /> 
Powiązane problemy