2013-04-03 5 views
18

私はこのような画像をワープしたい:Android:イメージをワープする方法は?

Example image

を追加しました2013年8月4日:私はこのコードを使用するが、正常に動作していない:

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/このライブラリをお試しください。 – Harshid

+0

あなたがこれを見たかどうか? https://github.com/huntergdavis/Easy_Image_Morphこれがあなたを助けてくれることを願っています。 – Shadow

+1

あなたの研究を共有することは誰にとっても役立ちます。何を試したのか、それがあなたのニーズを満たしていない理由を教えてください。これは、時間をかけて自分自身を助けようとしていることを示しています。明白な回答を繰り返さないようにしてくれています。そして、より具体的で適切な答えを得ることができます。 –

答えて

4

はるかに簡単ですあなた自身のコーディングよりもTransitionDrawable

第一および第二の層との間にクロスフェードに意図されLayerDrawablesの拡張を参照してください。トランジションを開始するには、 startTransition(int)を呼び出します。最初のレイヤーだけを表示するには、 resetTransition()を呼び出します。
<トランジション>要素を持つXMLファイルで定義できます。移行の各Drawableのはhereが1である、あなたがライン上の多くの例を見つけることができます>

ネストされた<項目で定義されています:

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

とコード

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

あなたは例やコードがあれば貼り付けてください。 – Roadies

+0

ありがとうございます。この回答は私の要求を満たしていません。タッチオブジェクトを使用して画像オブジェクトを変形しないようにしたいです... – Roadies

+0

@Roadiesあなたは少しの作業も行いますが、ボタンの例ですが、私がリンクしているドキュメントを読むと、そのクラスは一般的なdrawableを対象としていることがわかります。あなたはdrawableの周りに独自のコードを書く必要があります。 – ilomambo

0

これはOpenCVで実現できるので、試してみてくださいthis

関連する問題