2013-04-03 24 views
18

Böyle görüntüleri çözgü istiyorum:Android: görüntüleri nasıl çözülür?

Example image

Eklendi 2013/08/04: Bu kodu kullanılır ancak düzgün çalışmıyor:

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/ Bu kütüphaneyi deneyin. – Harshid

+0

Bunu gördünüz mü? https://github.com/huntergdavis/Easy_Image_Morph Umarım bu size yardımcı olabilir. – Shadow

+1

Araştırmanızı paylaşmak herkese yardımcı olur. Bize neyi denediğini ve neden ihtiyaçlarınızı karşılamadığını söyle. Bu, kendinize yardım etmeye çalışmak için zaman ayırdığınızı gösterir. Bu, açık cevapları yinelemekten kurtarır ve en önemlisi daha spesifik ve alakalı bir yanıt almanıza yardımcı olur! –

cevap

4

çok daha kolay olduğunu Kendini kodlamaktan daha çok. TransitionDrawable

birinci ve ikinci katman arasındaki çapraz solmaya amaçlanmıştır LayerDrawables bir uzantısı bakınız. Geçişi başlatmak için startTransition (int) 'yi arayın. Sadece ilk katmanı görüntülemek için resetTransition() öğesini çağırın.
< geçişi > öğesinde bir XML dosyasında tanımlanabilir. geçişte her Drawable here biridir on line birçok örnek bulabilirsiniz >

bir iç içe < kaleminde tanımlanır:

<?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> 

ve 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

, lütfen yapıştırın ... – Roadies

+0

Teşekkürler, bu cevap benim ihtiyacımı karşılamıyor. Resim nesnesini dokunarak kullanarak görüntüyü değiştirmemeye çalışıyorum ... – Roadies

+0

@Roadies Sizin için de biraz iş yaparsanız, bu örnek bir düğmeyle ilgilidir, ancak bağlandığım belgeleri okursanız, sınıfın genel olarak çekilebilirliğe yönelik olduğunu anlayacaksınız. kendi kodunuzu kendi çekmecelerinize yazmanız gerekir. – ilomambo

0

Bu OpenCV tarafından başarılabilir, bu yüzden this

İlgili konular