2012-02-01 27 views
9

Tôi đang sử dụng các phương pháp sau đây để kéo một tập tin PNG từ thư mục nội dung trong ứng dụng Android của tôi:Android: PNG Transparency Không có BitmapFactory.decodeStream (...) và tài sản thư mục

public static Bitmap getBitmapFromAssets(Context context, String fileName) { 
     try { 
      AssetManager assetManager = context.getAssets(); 
      InputStream inputStream = assetManager.open(fileName); 
      Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
      return bitmap; 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

Tôi sau đó thiết lập nguồn của một ImageView, trong mục của GridView, tới Bitmap đó.

Đây là XML layout trong câu hỏi:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/containingLayout" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:gravity="center_horizontal" 
    android:background="@android:color/transparent" 
    android:padding="0dp" 
    android:layout_margin="0dp" 
> 
    <ImageView 
     android:id="@+id/ivPackageIcon" 
     style="@style/smLargeGridItemPackageIconStyle" 
    /> 
</LinearLayout> 

Và phong cách đề cập đến trong XML đó là:

<style name="smLargeGridItemPackageIconStyle"> 
     <item name="android:scaleType">fitXY</item> 
     <item name="android:layout_width">100dp</item> 
     <item name="android:layout_height">142dp</item> 
     <item name="android:layout_margin">5dp</item> 
     <item name="android:background">@android:color/transparent</item> 
    </style> 

Đây là mã mà bộ nguồn của ImageView:

ImageView ivPackageIcon = (ImageView)containingView.findViewById(R.id.ivPackageIcon); 
     if(ivPackageIcon != null) { 
      Bitmap coverImage = getBitmapFromAssets(containingView.getContext(), "myimage.png"); 
      ivPackageIcon.setImageBitmap(coverImage); 
     } 

Hình ảnh PNG có một số khu vực trong suốt, nhưng vì một số lý do khi hình ảnh được hiển thị trong GridV của tôi iew, các khu vực trong suốt đi qua màu đen.

Để tránh một số câu hỏi: Không, nền của mục Hoạt động, ImageView, GridView và GridView không phải là màu đen. Như một vấn đề của thực tế, không có vấn đề gì màu nền được thiết lập để, các phần trong suốt của hình ảnh luôn luôn đi qua như là màu đen.

Xem xét việc này, mặc dù ... Nếu tôi đặt hình ảnh PNG trong thư mục drawable và thiết lập các ImageView như sau, tính minh bạch là hoàn hảo:

ivPackageIcon.setImageResource(R.drawable.myimage); 

Tôi khá chắc chắn rằng tôi đang sử dụng phương thức decodeStream (...) không chính xác bằng cách nào đó, nhưng tôi không biết mình đang làm gì sai. Tôi thậm chí đã sửa đổi phương thức ban đầu của mình để đặt một số tùy chọn như được hiển thị ở đây:

public static Bitmap getBitmapFromAssets(Context context, String fileName) { 
     try { 
      AssetManager assetManager = context.getAssets(); 
      InputStream inputStream = assetManager.open(fileName); 

      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inDither = true; 
      options.inPreferredConfig = Config.ARGB_8888; 

      Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options); 
      return bitmap; 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

Nhưng điều đó đã cho tôi kết quả kém như nhau.

Bất kỳ ý tưởng nào, bất kỳ ai?

Cảm ơn bạn.

+0

Tôi có cùng một sự cố: (bất kỳ cập nhật nào? – fvisticot

+0

Dường như bạn đang mất kênh alpha. Bạn có thể đổ pixel trong đối tượng Bitmap (sau khi giải mã) và kiểm tra xem bạn có đúng giá trị alpha trong vùng trong suốt không? Sử dụng Bitmap.getPixels(). – SirKnigget

Trả lời

0

Thay vào đó, hãy thử:

ImageView img=new ImageView(this); 
     Drawable d = Drawable.createFromStream(getAssets().open(path_in_assets), null); 
     img.setImageDrawable(d); 
0

Trong trường hợp hình ảnh của bạn được làm từ nguồn ứng dụng và nó được đặt dưới res/drawable/thay vì một trong những thư mục giải quyết cụ thể (ví dụ như res/drawable-hdpi)

Trình biên dịch android được tối ưu hóa PNG nên các điểm ảnh trong suốt đã trở nên trắng (hoặc đen trong trường hợp các tập tin Giff)

Độ phân giải: di chuyển tập tin PNG của bạn để res/drawable-hdpi hoặc một trong những khác các thư mục có thể kéo, một nd bạn nên được OK.

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