[NeverMind]
Внутренние комментарии для LayerDrawable.getPadding утверждают, что он берет отступ от первого элемента в списке. Если этот комментарий говорит правду, вы можете получить желаемое поведение, поместив произвольное (возможно, пустое) изображение перед вашим 9 патчем в списке.
Быстрое чтение кода, однако, подразумевает, что он на самом деле использует сумму всех отступов элемента, что означает, что нет способа устранить вашу проблему , используя LayerDrawable по умолчанию . Оператор подразумевает решение: реализовать подкласс LayerDrawable, который переопределяет «getPadding» для возврата {0, 0, 0, 0}. Возможно, вам придется инициализировать свой подкласс в коде, а не загружать макет XML, но это не особенно сложно.
[/ NeverMind]
Обновление:
Приведенное выше решение не работает, поскольку проблема заключается не в самом заполнении, а в том, что реализация по умолчанию устанавливает bounds каждого изображения в качестве суммы отступов предыдущих изображений. Другими словами, он навязывает вложенность, что и нужно большинству людей. Правильным решением по-прежнему является переопределение LayerDrawable, но вместо этого вы заменяете «onBoundsChange». Ниже приведена полная, протестированная демоверсия:
package com.beekeeper.ninepatchcover;
import android.app.Activity;
import android.graphics.*;
import android.graphics.drawable.*;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.ImageButton;
public class NinePatchCover extends Activity {
private Drawable mCover0;
private Drawable mCover1;
/** Called when the activity is first created. */
@Override public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Drawable button =
getResources().getDrawable(android.R.drawable.btn_default);
final Bitmap iconBitmap =
BitmapFactory.decodeResource(getResources(),
android.R.drawable.ic_menu_mylocation);
final BitmapDrawable icon = new BitmapDrawable(iconBitmap);
icon.setGravity(Gravity.CENTER);
mCover0 =
getResources().getDrawable(android.R.drawable.title_bar);
mCover1 =
getResources().getDrawable(android.R.drawable.title_bar);
final LayerDrawable unsolved =
new LayerDrawable(new Drawable[]{button, icon, mCover0});
final LayerDrawable solved =
new MyLayerDrawable(new Drawable[]{button, icon, mCover1,}, mCover1);
((ImageButton)findViewById(R.id.uncovered)).setBackgroundDrawable(unsolved);
((ImageButton)findViewById(R.id.covered)).setBackgroundDrawable(solved);
}
class MyLayerDrawable extends LayerDrawable {
Drawable mCover;
public MyLayerDrawable(final Drawable[] layers, final Drawable cover) {
super(layers);
mCover = cover;
}
@Override protected void onBoundsChange(final Rect bounds) {
super.onBoundsChange(bounds);
mCover.setBounds(bounds);
}
}
}
с использованием следующего макета / main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageButton android:id="@+id/uncovered"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
<ImageButton android:id="@+id/covered"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
</LinearLayout>
Ниже приведен пример скриншота:
Обновление 2:
По запросу, вот как вы можете изменить его, чтобы инициализировать селектор в коде. Замените инициализацию «mCover1» следующим кодом:
final StateListDrawable sld = new StateListDrawable();
sld.addState(new int[]{android.R.attr.state_pressed},
new ColorDrawable(0xffff0000));
sld.addState(new int[]{android.R.attr.state_window_focused},
new ColorDrawable(0xff00ff00));
sld.addState(new int[]{},
getResources().getDrawable(android.R.drawable.title_bar));
mCover1 = sld;
В обычном случае, когда окно находится в фокусе, но кнопка не нажата, оно будет отображаться зеленым цветом, при нажатии кнопки красным, а по умолчанию - серым, если окно не сфокусировано. (Попробуйте перетащить панель уведомлений «windowshade» вниз, чтобы увидеть окно в его несфокусированном состоянии.)