2013-04-03 14 views
18

Chcę wypacza obraz tak:Android: jak przeskakiwać obrazy?

Example image

Dodane 04/08/2013: Kiedyś ten kod, ale nie działa prawidłowo:

private static final int WIDTH = 20; 
    private static final int HEIGHT = 20; 
    private static final int COUNT = (WIDTH + 1) * (HEIGHT + 1); 

    private final Bitmap mBitmap; 
    private final float[] mVerts = new float[COUNT*2]; 
    private final float[] mOrig = new float[COUNT*2]; 

    private final Matrix mMatrix = new Matrix(); 
    private final Matrix mInverse = new Matrix(); 

    private static void setXY(float[] array, int index, float x, float y) { 
     array[index*2 + 0] = x; 
     array[index*2 + 1] = y; 
    } 

    public SampleView(Context context) { 
     super(context); 
     setFocusable(true); 

     mBitmap = BitmapFactory.decodeResource(getResources(), 
               R.drawable.ic_launcher); 

     float w = mBitmap.getWidth(); 
     float h = mBitmap.getHeight(); 
     // construct our mesh 
     int index = 0; 
     for (int y = 0; y <= HEIGHT; y++) { 
      float fy = h * y/HEIGHT; 
      for (int x = 0; x <= WIDTH; x++) { 
       float fx = w * x/WIDTH;      
       setXY(mVerts, index, fx, fy); 
       setXY(mOrig, index, fx, fy); 
       index += 1; 
      } 
     } 

     mMatrix.setTranslate(10, 10); 
     mMatrix.invert(mInverse); 
    } 

    @Override protected void onDraw(Canvas canvas) { 
     canvas.drawColor(0xFFCCCCCC); 

     canvas.concat(mMatrix); 
     canvas.drawBitmapMesh(mBitmap, WIDTH, HEIGHT, mVerts, 0, 
           null, 0, null); 
    } 

    private void warp(float cx, float cy) { 
     final float K = 10000; 
     float[] src = mOrig; 
     float[] dst = mVerts; 
     for (int i = 0; i < COUNT*2; i += 2) { 
      float x = src[i+0]; 
      float y = src[i+1]; 
      float dx = cx - x; 
      float dy = cy - y; 
      float dd = dx*dx + dy*dy; 
      float d = FloatMath.sqrt(dd); 
      float pull = K/(dd + 0.000001f); 

      pull /= (d + 0.000001f); 
     // android.util.Log.d("skia", "index " + i + " dist=" + d + " pull=" + pull); 

      if (pull >= 1) { 
       dst[i+0] = cx; 
       dst[i+1] = cy; 
      } else { 
       dst[i+0] = x + dx * pull; 
       dst[i+1] = y + dy * pull; 
      } 
     } 
    } 

    private int mLastWarpX = -9999; // don't match a touch coordinate 
    private int mLastWarpY; 

    @Override public boolean onTouchEvent(MotionEvent event) { 
     float[] pt = { event.getX(), event.getY() }; 
     mInverse.mapPoints(pt); 

     int x = (int)pt[0]; 
     int y = (int)pt[1]; 
     if (mLastWarpX != x || mLastWarpY != y) { 
      mLastWarpX = x; 
      mLastWarpY = y; 
      warp(pt[0], pt[1]); 
      invalidate(); 
     } 
     return true; 
    } 
+1

http://code.google.com/p/javamorph/ wypróbuj tę bibliotekę. – Harshid

+0

Czy widziałeś to? https://github.com/huntergdavis/Easy_Image_Morph Mam nadzieję, że to może ci pomóc. – Shadow

+1

Dzielenie się badaniami pomaga każdemu. Powiedz nam, co próbujesz i dlaczego nie spełnia Twoich potrzeb. To pokazuje, że poświęciłeś czas, aby spróbować pomóc sobie, to ratuje nas od powtarzania oczywistych odpowiedzi, a przede wszystkim pomaga ci uzyskać bardziej szczegółową i trafną odpowiedź! –

Odpowiedz

4

Jest znacznie łatwiej sposób niż kodowanie, które posiadasz. Zobacz TransitionDrawable

przedłużeniem LayerDrawables który jest przeznaczony do przekroju wyciszeniem między pierwszej i drugiej warstwy. Aby rozpocząć przejście, zadzwoń pod numer StartTransition (int). Aby wyświetlić tylko pierwszą warstwę, zadzwoń pod resetTransition().
Można go zdefiniować w pliku XML z elementem przejścia < przejścia >. Każdy rozciągliwej w przejściu jest zdefiniowana w zagnieżdżona <pozycji>

można znaleźć wiele przykładów na linii here jest jeden:

<?xml version="1.0" encoding="utf-8"?> 
<transition xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/first_image" /> 
    <item android:drawable="@drawable/second_image" /> 
</transition> 

a kod

final ImageView image = (ImageView) findViewById(R.id.image); 
final ToggleButton button = (ToggleButton) findViewById(R.id.button); 
button.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(final View v) { 
    TransitionDrawable drawable = (TransitionDrawable) image.getDrawable(); 
    if (button.isChecked()) { 
     drawable.startTransition(500); 
    } else { 
     drawable.reverseTransition(500); 
    } 
    } 
}); 
+0

jeśli masz przykład lub kod, więc wklej go ... – Roadies

+0

Dzięki, ale ta odpowiedź nie spełnia mojego wymagania Chcę wypaczyć obiekt obrazu, aby nie zmieniać obrazu za pomocą dotyku ... – Roadies

+0

@Roadies Oczekuje się robisz też trochę pracy, przykład dotyczy przycisku, ale jeśli przeczytasz dokumentację, do której się przyłączyłem, zrozumiesz, że ta klasa jest ogólnie przeznaczona do rysowania. musisz napisać swój własny kod na swoich rysunkach. – ilomambo

0

Można to osiągnąć za pomocą OpenCV, więc spróbuj, aby spróbować this

Powiązane problemy