2014-10-15 16 views
12

O yakınlaştırma/kaydırma efektleri ile araç basit beyaz tahta tür olması gerekiyordu tutarlar.Android Tuval, farklı zoom ile birden yolları

Yakınlaştırma/kaydırmaya gelince, her şey yol bölümünün tüm çizimi ile tamamdır.

Beyaz tahtaya yakınlaştırma uygulandığında, yaptığım yoldan bağımsız olarak, yakınlaştırma uygulandıktan sonra gelen tüm çizgiler, aslında okşadığım konumla ilgili olarak yer değiştirir.

Gereksiz kodu göstermeden ayrıntıları olabildiğince iyi göstermeye çalışacağım, yine de uzun bir mesaj, lütfen, lütfen benimle ol. Bir görüntü bin kelimeye bedeldir gibi, Ben durumu açıklayacaktır

: Yani

enter image description here

enter image description here

enter image description here

enter image description here

, birçok denedim herhangi bir başarı olmadan farklı yaklaşımlar. Bu Görünüm uzanan uygulanacağı

:

Şimdi teknik kısmına aşağı, bu şu an ne yapıyorum olduğunu.

sadece vuruş canlandırma gerçekleştirmek için onDraw yöntemi kullanmak uygulanan: I doğru çekme sonrasında elde edilen bir bit eşlem yerleştirmek için kullanıldığı iki ImageViews ve gerçekleştirilir yakınlaştırma

@Override 
public void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 

    if(isDrawing) 
    { 
     canvas.drawPath(mPath, mPaint); 
     canvas.drawBitmap(mBitmap, 0, 0, mPaint); 
    } 
} 

. İki görünüm kullanmamın nedeni, çizim oluşturma anında her zaman tek bir görünüm sağlamak için bunları değiştirmektir. şey tuvale çizilen sonra

<ImageView 
android:id="@+id/imageView" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_alignParentLeft="true" 
android:layout_alignParentTop="true"  
android:visibility="visible"  
android:scaleType="matrix" /> 

<ImageView  
android:id="@+id/imageView2" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_alignParentLeft="true"   
android:layout_alignParentTop="true"  
android:visibility="visible"  
android:scaleType="matrix" /> 

, benim görünümüne verilen bit eşlem göndermek, o zaman daha çizimlere yeni marka ayarlamak için tuval temizlemek:

private void sendImage2BackView() 
{ 
    //veeery extensive and boring code surpressed here 

    //set the entire hocus-pocus' resulting bitmap as a resource for my view 
    mView.setImageBitmap(tempBmp); 
    mView.bringToFront(); 


} 

Bir ScaleListener sınıf uygulamak olduğunu

@Override 
public boolean onScale(ScaleGestureDetector detector) 
{ 
    drawAction = ZOOM;  
    scaleFactor *= detector.getScaleFactor(); 
    scaleFactor = Math.max(MIN_ZOOM, Math.min(scaleFactor, MAX_ZOOM)); 

    canvas.setScaleFactor(scaleFactor); 
    return true; 
} 
: onScale anlarında ScaleGestureDetector.SimpleOnScaleGestureListener

uzanır, benim tuval benim scalling oranı ne anlatmak

mView.setScaleX(factor); 
    mView.setScaleY(factor);  

Şimdi, en önemli kısmı, onScaleEnd de, ben girişimi bir yöntemini çağırın:

Sonra benim Görünüm (tuval obj) de, sadece görünümüne ölçek kullanılıyor set Mevcut tuval bitmap AS OLMAK ve kardeşleri, her biri kendi büyüklüğü ve ofset ile huzur içinde uymak için benim görüşüme göndermek.

public void setScaleEnd() 
    { 
     //Lots of more boring code surpressed here 
     //.... 

     //I store the bitmap that was contained at the ImageView 
     // IF anyone is present 
     previousBmp = ((BitmapDrawable)mView.getDrawable()).getBitmap(); 

     //then, I create a brand new scaled bitmap,in order to 
     // acquire the same proportion of ZOOM that I've just applied 
     tempBmp = Bitmap.createScaledBitmap(previousBmp, 
      (int)(mView.getWidth()*scaleFactor), 
      (int)(mView.getHeight()*scaleFactor), true); 


     int height = (int)(mView.getHeight()*scaleFactor); 
     int width = (int)(mView.getWidth()*scaleFactor); 

     //set my matrix 
     mMatrix = new Matrix(); 

     //give it the right proportion 
     mMatrix.postScale(scaleFactor, scaleFactor); 

     translationX = mView.getWidth()/2 - width/2; 
     translationY = mView.getHeight()/2 - height/2; 

     //give it some necessary translation amount 
     mMatrix.postTranslate(translationX, translationY); 

     //set the matrix to the view, and send the resized bitmap to my ImageView. 
     mView.setImageMatrix(mMatrix); 
     mView.setImageBitmap(tempBmp); 
    } 

Şimdi, her şeyi sırasında denedim ben sadece bunu bir ölçek vererek tuvale düz gösterdi/miktarını çevirmek; bitmapler ile ayrı ayrı çalışmayı denedikten sonra yeni bir temiz tuvale geri gönderdi.

Yine de belirli bir ZOOM uygulandıktan sonra bu deplasman vuruşlarıma devam ediyorum! Sadece çizebilmek istiyorum; bir zoom ver; sonra biraz daha şeyler çizin ve çizdiğim yerde konturlar kalsın!

Bu mümkün mü?

Sadece S Note uygulamasıyla oynuyordum, tam olarak ne yapmaya çalıştığımı yapıyor.

+1

Nasıl yardımcı olabileceğimi bilmiyorum, ama bu StackOverflow'ta gördüğüm en ayrıntılı soru, tebrikler! – Paladini

+0

Teşekkürler @FernandoPaladini! –

+1

Bu yoldan gittim ve iyi bir vektör oluşturma kitaplığı kullanmanızı tavsiye ederim. Android yollarının gerçekleştirilmesi, görüntülemede aşırı derecede yavaştır ve büyük boyutlarda (zum) düz eğimli değildir. İyi bir açıkveri uygulamasına bakın. –

cevap

4

Size bir çözüm önermek istiyorum, ancak çalışacağından emin değilim.

İlk başta ben bu kodda büyük bir hata yaptık, netleştirmek gerekir:

 tempBmp = Bitmap.createScaledBitmap(previousBmp, 
     (int)(mView.getWidth()*scaleFactor), 
     (int)(mView.getHeight()*scaleFactor), true); 

Diyelim ki 1280x800 piksel ve ölçek faktörü 4x hatta 10x barındıran bir tablet olduğunu varsayalım. 16Mb ve 40Mb Bitmap'i buna göre ayırmaya çalışacaksınız!

Buraya atılan OutOfMemoryError numarasını almak çok kolay, bu yüzden kavramsal olarak başka bir yaklaşım kullanmanız gerekiyor.

Picture sınıfını kullanmanızı öneririm.

  1. Sen kullanıcıya sunuyorsunuz orijinal resmin hangi boyutta belirlemek gerekir?
  2. Bundan sonra, şimdi ölçek faktörünü uygulayabilirsiniz
  3. yöntemi Picture.beginRecord(int width, int height) kullanarak resmin etrafında Canvas nesne oluşturmak tuvali çevirmek ve çizim işlemleri gerçekleştirmek gerekir.
  4. onDraw() yönteminde, resminizi Picture.draw(Canvas canvas) yöntemini kullanarak tuvale uygulanan karşılık gelen ayarlarla (ölçek faktörü, çeviri) çizmeniz gerekir.

Bu çözümü deneyin vermedi, ama ben Picture sınıf yardımcı olacağını umuyoruz.

+2

Hey @Olekssi Kropachov, yardım için çok teşekkürler. Bunu deneyeceğim ve sonra çalışıp çalışmadığını size anlatacağım. Bu Resim dersini tanımıyordum, yasal görünüyor! Ve görüntü yeniden boyutlandırma tavsiyesi için teşekkürler! –

+0

Hey @Oleksii Kropachov, Resim nesnesini kullanmayı denedim, çalışması gerektiği gibi oldukça havalı görünüyor. Ancak, talihsiz, hiç işe yaramadı. Donanımın hızlandırılmasının yanı sıra, hiçbir şey çizemedim, yakınlaştırma yapmaya izin vermedim ve matrisi kaydırma. –

+0

Sadece gelişmemizi takip edebilmeniz için bunu onDraw yöntemine yazdım: \t Resim resmi = new Picture(); \t Tuval cnv = picture.beginRecording (_w, _h); \t cnv.drawColor (Color.CYAN); \t cnv.drawPath (mPath, mPaint); \t cnv.drawBitmap (mBitmap, 0, 0, mPaint); \t \t picture.draw (cnv); \t mCanvas.drawPicture (resim); \t picture.endRecording(); Ve vuruşlarımı bile ekranda ayarlamadı. Doğrudan tuvalim üzerine çizmeme rağmen, her şey yolunda gider canvas.drawPath (mPath, mPaint); \t \t canvas.drawBitmap (mBitmap, 0, 0, mPaint); –

İlgili konular