1

大きな通知アイコンに 4 つのビットマップを配置したい。各ビットマップは、アイコンの 4 分の 1 に配置する必要があります。

アイコンのレイアウト「notification_large_icon_layout.xml」を作成しました。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/notification_large_icon_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/thumbnail1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ic_contact_picture" />

    <ImageView
        android:id="@+id/thumbnail2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/thumbnail1"
        android:src="@drawable/ic_contact_picture" />

    <ImageView
        android:id="@+id/thumbnail3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/thumbnail1"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/ic_contact_picture" />

    <ImageView
        android:id="@+id/thumbnail4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/thumbnail2"
        android:layout_alignRight="@+id/thumbnail3"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/ic_contact_picture" />

</RelativeLayout>

そして、通知機能に次のコードを追加しました。

...
// Create bitmap and scale it to 1/2
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(rowUri));
Resources res = getApplicationContext().getResources();
int height = (int) res.getDimension(android.R.dimen.notification_large_icon_height);
int width = (int) res.getDimension(android.R.dimen.notification_large_icon_width);
bitmap = Bitmap.createScaledBitmap(bitmap, width/2, height/2, false);

// Inflate the layout for the large icon                            
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.notification_large_icon_layout, null);

// Copy bitmap to the 4 views
ImageView thumbnailView = (ImageView) view.findViewById(R.id.thumbnail1);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail2);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail3);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail4);
thumbnailView.setImageBitmap(bitmap);

// Convert view to bitmap
Bitmap icon = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(icon);
view.draw(canvas);

notificationBuilder.setLargeIcon(icon);
...

うまくいきません。アイコンは灰色のみです。

変更 1:

次のようにレイアウトを変更しました(柔軟性が低くなります):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/notification_large_icon_layout"
    android:layout_width="128dp"
    android:layout_height="128dp" >

    <ImageView
        android:id="@+id/thumbnail1"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

    <ImageView
        android:id="@+id/thumbnail2"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/thumbnail1" />

    <ImageView
        android:id="@+id/thumbnail3"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/thumbnail1" />

    <ImageView
        android:id="@+id/thumbnail4"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/thumbnail2"
        android:layout_toRightOf="@+id/thumbnail3" />

</RelativeLayout>

そして、関数を次のように変更しました。

...
// Create bitmap and scale it to 1/2
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(rowUri));
Resources res = getApplicationContext().getResources();
int height = (int) res.getDimension(android.R.dimen.notification_large_icon_height);
int width = (int) res.getDimension(android.R.dimen.notification_large_icon_width);
bitmap = Bitmap.createScaledBitmap(bitmap, width/2, height/2, false);

// Inflate the layout for the large icon                            
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.notification_large_icon_layout, null);

view.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 

// Copy bitmap to the 4 views
ImageView thumbnailView = (ImageView) view.findViewById(R.id.thumbnail1);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail2);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail3);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail4);
thumbnailView.setImageBitmap(bitmap);

// Convert view to bitmap
Bitmap icon = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(icon);
view.draw(canvas);

notificationBuilder.setLargeIcon(icon);
...

これで、半分の解像度/密度のビットマップが 1 つ表示されます。4 つのビットマップが重なっているようです。

変更 2:

次のコードが機能します。

...
// Create bitmap and scale it to 1/2
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(rowUri));
Resources res = getApplicationContext().getResources();
int height = (int) res.getDimension(android.R.dimen.notification_large_icon_height);
int width = (int) res.getDimension(android.R.dimen.notification_large_icon_width);
bitmap = Bitmap.createScaledBitmap(bitmap, width/2, height/2, false);

// Inflate the layout for the large icon
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.notification_large_icon_layout, null);
view.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 

// Copy bitmap to the 4 views
ImageView thumbnailView = (ImageView) view.findViewById(R.id.thumbnail1);
thumbnailView.setBottom(height/2);
thumbnailView.setRight(width/2);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail2);
thumbnailView.setBottom(height/2);
thumbnailView.setLeft(width/2);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail3);
thumbnailView.setTop(height/2);
thumbnailView.setRight(width/2);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail4);
thumbnailView.setTop(height/2);
thumbnailView.setLeft(width/2);
thumbnailView.setImageBitmap(bitmap);

// Convert view to bitmap
Bitmap icon = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(icon);
view.draw(canvas);

notificationBuilder.setLargeIcon(icon);
...

しかし、なぜビットマップの位置を明示的に定義する必要があるのだろうか。

ところで: 次のスニペット A と B の結果は同じです。違いがわかりません。

スニペット A:

Bitmap icon = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(icon);
view.draw(canvas);

スニペット B:

view.setDrawingCacheEnabled(true);
Bitmap icon = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
4

1 に答える 1

0

私は間違いを見つけました。ImageView の属性 android:src によって参照されるアイコンのサイズが間違っていました。サイズを 64 x 64 に変更した後、レイアウトは正しく膨張する可能性があります。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/notification_large_icon_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<ImageView
    android:id="@+id/thumbnail1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="centerCrop"
    android:src="@drawable/ic_icon" />

<ImageView
    android:id="@+id/thumbnail2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/thumbnail1"
    android:scaleType="centerCrop"
    android:src="@drawable/ic_icon" />

<ImageView
    android:id="@+id/thumbnail3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/thumbnail1"
    android:scaleType="centerCrop"
    android:src="@drawable/ic_icon" />

<ImageView
    android:id="@+id/thumbnail4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/thumbnail2"
    android:layout_toRightOf="@+id/thumbnail3"
    android:scaleType="centerCrop"
    android:src="@drawable/ic_icon" />

</RelativeLayout>

私のソースは次のようになります。

...
Resources res = getApplicationContext().getResources();
int height = (int) res.getDimension(android.R.dimen.notification_large_icon_height);
int width = (int) res.getDimension(android.R.dimen.notification_large_icon_width);

// Inflate the layout for the large icon
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.notification_large_icon_layout, null);
view.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

// Copy bitmap to the 4 views                           
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(rowUri));
ImageView thumbnailView = (ImageView) view.findViewById(R.id.thumbnail1);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail2);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail3);
thumbnailView.setImageBitmap(bitmap);
thumbnailView = (ImageView) view.findViewById(R.id.thumbnail4);
thumbnailView.setImageBitmap(bitmap);

// Convert view to bitmap
Bitmap icon = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(icon);
view.draw(canvas);

notificationBuilder.setLargeIcon(icon);
...
于 2013-08-20T20:55:20.790 に答える