2016-03-27 16 views
0

Bir görüntü görünümünden bir bitmap almaya çalışıyorum ve sonra ölçeklendiriyorum. ı imageview bitirir önce ölçülecek çünkü internet arama ve bitmap'e dönüştürülür gibiAndroid - Görünüm Ölçü Edildiğinde Bitmap'i Güncelle

: "> 0 olmalıdır genişlik ve yükseklik java.lang.IllegalArgumentException"

: Ama aşağıdaki hatayı alıyorum Ben bitmap'i güncellemeye çalışıyorum. Bunu nasıl düzeltebilirim? Kodum aşağıdaki gibidir:

profileImage.buildDrawingCache(); 
Bitmap bm = profileImage.getDrawingCache(); 

int widthPixel = bm.getWidth(); 
int heightPixel = bm.getHeight(); 
int basePixel; 
float widthRatio; 
float heightRatio; 

if (widthPixel < heightPixel) { 
    basePixel = widthPixel; 
} 
else { 
    basePixel = heightPixel; 
} 

if (basePixel > 180) { 
    widthRatio = 180/basePixel; 
    heightRatio = 180/basePixel; 
} 
else { 
    widthRatio = 1; 
    heightRatio = 1; 
} 

Bitmap bmResized = Bitmap.createScaledBitmap(bm,(int)(bm.getWidth()*widthRatio), (int)(bm.getHeight()*heightRatio), true); 
// bm.recycle(); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bmResized.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byteArray1 = stream.toByteArray(); 

Düzenlendi Kodu (": değer boş olmayabilir java.lang.IllegalArgumentException." Hata şimdi alma):

        profileImage.buildDrawingCache(); 
            bm = profileImage.getDrawingCache(); 



            profileImage.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { 
             public boolean onPreDraw() { 
              profileImage.getViewTreeObserver().removeOnPreDrawListener(this); 

              widthPixel = profileImage.getMeasuredWidth(); 
              heightPixel = profileImage.getMeasuredHeight(); 

              if (widthPixel < heightPixel) { 

               basePixel = widthPixel; 

              } 

              else { 

               basePixel = heightPixel; 

              } 


              if (basePixel > 180) { 

               widthRatio = 180/basePixel; 
               heightRatio = 180/basePixel; 


              } 

              else { 

               widthRatio = 1; 
               heightRatio = 1; 

              } 


              Bitmap bmResized = Bitmap.createScaledBitmap(bm,(int)(bm.getWidth()*widthRatio), (int)(bm.getHeight()*heightRatio), true); 
              // bm.recycle(); 

              ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
              bmResized.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
              byteArray1 = stream.toByteArray(); 

              image1 = new ParseFile("profilePhoto.jpg", byteArray1, "image/jpg"); 

              return true; 
             } 
            }); 

cevap

1

bir OnPreDrawListener kullanın. OnPreDrawListener, Görünüm boyutlarınızı Görünümünüzün ölçüm işleminden sonra, ancak düzen aşamasından önce almanıza olanak tanır. Bu, View boyutlarınızı alabileceğiniz en erken tarih anlamına gelir.

view.getViewTreeObserver().adOnPreDrawListener(new OnPreDrawListener() { 
    public boolean onPreDraw() { 
     view.getViewTreeObserver().removeOnPreDrawListener(this); 


     int width = view.getMeasuredWidth(); 
     int height = view.getMeasuredHeight(); 

     // TODO scale your bitmap here 

     return true; 
    } 
}); 
+0

Merhaba Reiner, ben "OnPreDrawListener" ile yukarıdaki gibi kodumu düzenlenmiş, ama şimdi alıyorum "java.lang.IllegalArgumentException. Değeri boş olmayabilir" hata. Kodumu yukarıda kontrol edebilir misin? Teşekkür ederim. – saner

+0

Uygulamanız bir İstisna ile kilitlendiğinde, belirtilen satır numarasına bakın. Bu, kodunuzda hatanın gerçekleştiği satırı işaret eder, böylece sorunu ayıklayabilirsiniz. Atanan hatanın bir 'IllegalArgumentException' olduğunu ve mesajın 'değer' null 'olamayacağını belirttiğinizden, sanırım bir "boş" Bitmap'i yeniden boyutlandırmaya çalışıyorsunuzdur. – Reinier

+0

@saner Yaklaşımınızla ilgili bazı sorunlar var. Bir View'in çizim önbelleğini bir "Bitmap" haline getirmeye çalışıyorsunuz. Ancak, Görünüm henüz çizilmemiştir, bu nedenle View'un çizim önbelleği boştur ve 'view.getDrawingCache() 'işlevini' null 'olarak döndürür. Görünüm'ü çizmeye zorlayın (SO üzerinde çok sayıda örnek) veya başka bir yaklaşımı ele alın. Bir alternatif, view.getDrawable() 'işlevini çağırmak ve sonra" Çizilebilir "i yeniden boyutlandırabileceğiniz bir Bitmap'e dönüştürmek olabilir. – Reinier

İlgili konular