2011-08-11 28 views
27

Tôi đang đặt hộp thoại tiến trình có thể kéo được (pbarDialog) nhưng vấn đề của tôi là tôi muốn đổi kích thước mỗi lần vẽ nhưng không thể hiểu được cách thực hiện.Thay đổi kích thước có thể vẽ trong Android

Dưới đây là một số mã:

Handler progressHandler = new Handler() { 

    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      // some more code 
      case UPDATE_PBAR: 
       pbarDialog.setIcon(mAppIcon); 
       pbarDialog.setMessage(mPbarMsg); 
       pbarDialog.incrementProgressBy(mIncrement+1); 
       break; 
     } 
    } 
}; 

pbarDialog.show(); 

Thread myThread = new Thread(new Runnable() { 

    public void run() { 
     // some code 
     for (int i = 0; i < mApps.size(); i++) { 
      mAppIcon = mAdapter.getIcons().get(mApps.get(i).getPackageName()); 
      // need to resize drawable here 
      progressHandler.sendEmptyMessage(UPDATE_PBAR); 
     } 
     handler.sendEmptyMessage(DISMISS_PBAR); 
    } 

}); 

myThread.start(); 
+0

bạn có thể rút lại kích thước không? –

+2

sử dụng Bitmap.createScaledBitmap (src, dstWidth, dstHeight, filter) – Sameer

Trả lời

74

Sau đây làm việc cho tôi:

private Drawable resize(Drawable image) { 
    Bitmap b = ((BitmapDrawable)image).getBitmap(); 
    Bitmap bitmapResized = Bitmap.createScaledBitmap(b, 50, 50, false); 
    return new BitmapDrawable(getResources(), bitmapResized); 
} 
+1

Tôi nhận được lỗi này tại dòng đầu tiên của mã: java.lang.ClassCastException: android.graphics.drawable.PictureDrawable không thể được truyền tới android.graphics.drawable.BitmapDrawable –

+4

sử dụng đối số Drawable as và đưa nó vào BitmapDrawable!? nếu bạn chắc chắn rằng nó luôn luôn là một BitmapDrawable vì vậy thay đổi loại đối số để BitmapDrawable quá, nếu không có thể nó là tốt đẹp để kiểm tra loại drawable trước khi đúc. –

18

Đây là nơi tôi đã kết thúc, một phần nhờ vào Saad của câu trả lời:

public Drawable scaleImage (Drawable image, float scaleFactor) { 

    if ((image == null) || !(image instanceof BitmapDrawable)) { 
     return image; 
    } 

    Bitmap b = ((BitmapDrawable)image).getBitmap(); 

    int sizeX = Math.round(image.getIntrinsicWidth() * scaleFactor); 
    int sizeY = Math.round(image.getIntrinsicHeight() * scaleFactor); 

    Bitmap bitmapResized = Bitmap.createScaledBitmap(b, sizeX, sizeY, false); 

    image = new BitmapDrawable(getResources(), bitmapResized); 

    return image; 

} 
+0

hoàn hảo, đây là con đường tôi đã. – Tony

+0

Đẹp mã hóa. Chính xác những gì tôi cần. Cảm ơn bạn, anh em :) –

+0

Hãy cẩn thận với điều này: "hình ảnh" có thể vẽ được trước đây chứa một ảnh bitmap chưa được tái chế. Gọi "image = scaleImage (hình ảnh, 2)" sẽ gây ra sự rò rỉ tạm thời. Người gọi scaleImage do đó có trách nhiệm tái chế cả hình ảnh gốc và hình ảnh được chia tỷ lệ ... Điều này có thể không phải là vấn đề trong các ứng dụng nhỏ nhưng quan trọng trong các ứng dụng chuyên sâu về bộ nhớ. –

5

Đối thay đổi kích thước, điều này là tốt đẹp và ngắn (mã ở trên không làm việc cho tôi), được tìm thấy here:

ImageView iv = (ImageView) findViewById(R.id.imageView); 
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.picture); 
    Bitmap bMapScaled = Bitmap.createScaledBitmap(bMap, newWidth, newHeight, true); 
    iv.setImageBitmap(bMapScaled); 
+0

Điều này làm việc khi tôi muốn thay đổi kích thước Drawable trước khi đặt nó thành imageBitmap thành ImageView. Cám ơn –

1

Có thể giải pháp của tôi không bao gồm câu hỏi hoàn toàn, nhưng tôi cần một thứ gì đó như "CustomDrawable".

Nói cách khác, tôi muốn đặt biểu trưng ở phía trước hình tròn. Vì vậy, tôi tạo ra một FrameLayout với một nền (chỉ là một vòng tròn màu) và ở phía trước của hình tròn này tôi hiển thị logo.

Để thay đổi kích thước biểu tượng Tôi co logo bằng cách co giãn - đây là một số mã:

iv = new ImageView(mContext); 

iv.setScaleX(0.75f); // <- resized by scaling 
iv.setScaleY(0.75f); 

// loading the drawable from a getter (replace this with any drawable) 
Drawable drawable = ML.loadIcon(mContext, Integer.parseInt(icon)); 

iv.setImageDrawable(drawable); 

// icon get's shown inside a ListView 
viewHolder.mIvIcon.addView(iv); 

Đây là FrameLayout trong đó cho thấy các biểu tượng bên trong hàng ListView của:

<FrameLayout 
    android:id="@+id/iv_card_icon" 
    android:layout_width="48dp" 
    android:layout_height="48dp" 
    android:src="@drawable/circle" 
    android:layout_marginStart="16dp" 
    /> 

Xem này giải pháp như một lựa chọn/ý tưởng.

Các vấn đề liên quan