2013-04-03 9 views
18

Ich möchte Bilder wie diese verziehen:Android: wie Bilder zu verzerren?

Example image

Added 2013.08.04: habe ich diesen Code, aber es funktioniert ist nicht richtig:

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/ versuchen Sie diese Bibliothek. – Harshid

+0

Ob Sie das gesehen haben? https://github.com/huntergdavis/Easy_Image_Morph Hoffe das könnte dir helfen. – Shadow

+1

Teilen Sie Ihre Forschung hilft allen. Sagen Sie uns, was Sie ausprobiert haben und warum es nicht Ihren Bedürfnissen entspricht. Dies zeigt, dass Sie sich die Zeit genommen haben, sich selbst zu helfen, es rettet uns davor, offensichtliche Antworten zu wiederholen, und vor allem hilft es Ihnen, eine spezifischere und relevantere Antwort zu bekommen! –

Antwort

4

Es gibt eine viel einfacher Art und Weise als Codierung Sie besitzen. Siehe TransitionDrawable

Eine Erweiterung, die zwischen LayerDrawables die erste und die zweite Schicht zu Überblendungs ​​vorgesehen ist. Um den Übergang zu starten, rufen Sie startTransition (int). Um nur die erste Ebene anzuzeigen, rufen Sie resetTransition() auf.
Es kann in einer XML-Datei mit dem < Übergang > Element definiert werden. Jeder Drawable im Übergang befindet sich in einem verschachtelten < Element definiert >

Sie viele Beispiele auf Linie finden, here ist ein:

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

und der Code

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

Wenn Sie ein beliebiges Beispiel oder einen Code haben, bitte fügen Sie es ein ... – Roadies

+0

Danke, aber diese Antwort nicht erfüllen meine Anforderung Ich möchte Bildobjekt verzerren, um das Bild nicht mit Touch zu ändern ... – Roadies

+0

@Roadies Es wird erwartet für Sie tun ein wenig Arbeit auch, das Beispiel ist für einen Knopf, aber wenn Sie die Dokumentation lesen, mit der ich verband, werden Sie verstehen, dass die Klasse auf drawables im Allgemeinen zielt. Sie müssen Ihren eigenen Code um Ihre Zeichenbilder schreiben. – ilomambo

0

Dies könnte durch OpenCV erreicht werden, versuchen Sie also this

Verwandte Themen