2011-03-18 12 views
8

Bir bitmap'i eğriltmek istiyorum (bu doğru sözcük değilse beni düzeltin) ve derinlikli görünmesini sağlayın. İstediğimi görselleştirmenin iyi bir yolu, Star Wars'un kredilerinin derinliği göstermek için nasıl açıldığıdır.Sadece dikey yönde bir bitmap'i eğme

Aşağıdaki denedim:

canvas.getMatrix().postSkew(kx,ky,px,py); 

ve

canvas.skew(sx,sy); 

Ama çok başarı olmadı. Yukarıdaki yöntemler her zaman bitmap'i bir paralelkenar haline dönüştürmektedir. Bitmap'i bunun yerine bir yamuk haline dönüştürmenin bir yolu var mı?

Burada, Romain'in beni işaret ettiği örneklerden aldığım bir kod pasajı var.

canvas.rotate(-mOrientation[0] + mHeading, mCenterX, mCenterY); 

camera.save(); 

if (mReverse) { 
    camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); 
} else { 
    camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); 
} 

camera.rotateX(mOrientation[1]); 
camera.applyToCanvas(canvas); 
canvas.drawPath(mPath, mPaint); 
canvas.drawCircle(mCenterX, mCenterY, mRadius - 37, mPaint); 

camera.restore(); 

cevap

6

İstediğiniz efekti skew() ile elde edemezsiniz. Ancak, bu efekti elde etmek için bir Kamera nesnesini ve 3D döndürmeleri kullanabilirsiniz. Kamera, daha sonra Tuval üzerine uygulayabileceğiniz bir Matris oluşturacaktır. Sonuç, perspektif doğru olmayacak, ancak amacınız için yeterince iyi olmayacaktır. 3D rotasyonlar örneğin Honeycomb Launcher'da (ve diğer pek çok uygulamada) nasıl yapılır?

+0

Harika! Bunu bilmiyordum. –

+3

Evet, ApiDemos - Rotate 3D Animation'da bu, Camera sınıfında bunu yapan bir örnek var. Yeni bir android proje oluşturun ve "mevcut örneklemden proje oluştur" u seçin, hedef os'u ve ardından ApiDemos'u seçin. Uygulama çalışırken Görünüm> Animasyon> 3D geçişi seç – Lumis

+0

Animasyonların gitmenin yolu olmadığını düşünüyorum. Sabit bir cihaz sensörü değerleri (artırılmış gerçeklik) akışına dayalı olarak bir brandadaki grafikleri manipüle ediyorum. Bunu yapmanın başka bir yolu var mı? OpenGL gibi 3D grafikler kullanmalı mıyım? Teşekkürler. – mdupls

1

ben "Yıldız Savaşları etkisi" Ben Matrix tarafından desteklenen tek operasyonlar olduğunu düşünüyorum bir affine transformation olduğunu düşünmüyorum.

12

Bugün bunun üzerinde çok fazla zaman harcadım (aynı problemle karşılaştı) ve aşağıdaki kodla geldim.

Dikkat edilmesi gereken önemli bir nokta da, preTranslate() ve postTranslate() öğesini Canvas alanınızın merkezine (veya başka bir yere) ayarlamanız gerekir. Varsayılan olarak, üst sol köşenin yerine (x = 0, y = 0), dönüşümü uygulamak için görüntünün merkezini kullandığı anlamına gelir. Bu yüzden beklediğiniz şey yerine bir paralelkenar elde edersiniz, bir yamuk (Bana bunların isimlerini öğrettiğiniz için teşekkürler).

Karşılaştığım diğer önemli şey, Tuval/Kameradaki Kaydet/Geri Yükle işlevleridir. Temel olarak, her seferinde durumu geri yüklemeden üç kez arka arkaya Döndür işlevini çağırırsanız, çizdiğiniz her seferde nesneyi döndürerek dönersiniz. İstediğin bu olabilir, ama kesinlikle benim durumumda yoktu. Aynı şey, Matrix'i Temel olarak Kamera nesnesinden Tuval'e uyguladığınız ve aynı şeyin gerçekleşmesi durumunda sıfırlanması gereken tuval için de geçerlidir.

Bunun birisine yardım edeceğini umarız, bu yeni başlayanlar için iyi belgelenmez. Bunu okuyan herkese ipucu, SDK Örneklerindeki APIDemos klasörüne bakın. Bunu da gösteren bir Rotate3dAnimation.java dosyası var.

//Snippet from a function used to handle a draw 
mCanvas.save(); //save a 'clean' matrix that doesn't have any camera rotation in it's matrix 
ApplyMatrix(); //apply rotated matrix to canvas 
Draw(); //Does drawing 
mCanvas.restore(); //restore clean matrix 
//  

public void ApplyMatrix() { 
    mCamera.save(); 
    mCamera.rotateX(-66); 
    mCamera.rotateY(0); 
    mCamera.rotateZ(0); 
    mCamera.getMatrix(mMatrix); 

    int CenterX = mWidth/2; 
    int CenterY = mHeight/2; 
    mMatrix.preTranslate(-CenterX, -CenterY); //This is the key to getting the correct viewing perspective 
    mMatrix.postTranslate(CenterX, CenterY); 

    mCanvas.concat(mMatrix); 
    mCamera.restore();  
} 
+0

Bu, istediğimin yolunda görünüyor. Matrisi dönüştürmek ve tuvali değiştirmek için yönlendirme değerlerini (azimut, perde, rulo) kullanmakta hala zorlanıyorum. Cihazın sağa ve sola eğildiği için resimlerin sabit kaldığı (kullanıcının görünümünden kaynaklanan yönlendirme açısından) stok Android galerisine benzer bir efekt elde etmeye çalışıyorum. – mdupls

+0

Bu, sahip olduğumla ilgili benzer bir konu gibi görünüyor, sadece hem bitmapler hem de metinlerle uğraştığım gibi. Bu konuyu da kontrol edebilir misiniz: http://stackoverflow.com/q/32180534/878126 –

İlgili konular