Android закругленные углы в ListView - PullRequest
3 голосов
/ 20 июля 2011

У меня есть ListView с закругленными углами, сделанные с использованием следующей формы в качестве фона:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#ffffff"/>
<corners android:bottomRightRadius="13px" android:bottomLeftRadius="13px" android:topLeftRadius="13px" android:topRightRadius="13px"/>
</shape>

Проблема заключается в селекторе. Он имеет форму прямоугольника, поэтому при выборе первого или последнего элемента углы больше не округляются. Я нашел очень хорошее решение в последнем посте на http://www.anddev.org/view-layout-resource-problems-f27/rounded-corners-on-listview-t8193-15.html. Проблема в том, что я не могу создать другой класс для наследования от ListView. Как я могу применить этот метод, когда единственное, что у меня есть, это ссылка на существующий ListView? Причина, по которой я должен сделать это, заключается в том, что макет раздувается из xml.

Я ищу что-то вроде:

ListView lv = (ListView)findViewById(...);
lv.onSizeChanged = protected void onSizeChanged(int w, int h, int oldw, int oldh){ ... }

Спасибо

Ответы [ 3 ]

4 голосов
/ 06 сентября 2011

Похоже, нет другого пути, кроме расширения класса ListView и использования его в XML.Вот пример кода:

public class WListView extends LinearLayout
{
    // =================================================================
    // Variables
    // =================================================================
    private Path clipArea;

    // =================================================================
    // Public methods
    // =================================================================

    public WListView(Context context)
    {
        super(context);
    }

    public WListView(Context context, AttributeSet attr)
    {
        super(context, attr);
    }

    // =================================================================
    // Private methods
    // =================================================================


    @Override
    protected void onSizeChanged(int w, int h, int oldW, int oldH)
    {
        super.onSizeChanged(w, h, oldW, oldH);
        clipArea = new Path();
        RectF rect = new RectF(0, 0, w, h);

        int cornerRadius = 13; // we should convert px to dp here
        clipArea.addRoundRect(rect, cornerRadius, cornerRadius, Path.Direction.CW);
    }

    @Override
    protected void dispatchDraw(Canvas canvas)
    {
        canvas.save();
        canvas.clipPath(clipArea);
        super.dispatchDraw(canvas);
        canvas.restore();
    }
}
0 голосов
/ 29 ноября 2011

Вы можете сделать прозрачное изображение 9Patch с закругленными углами и использовать его в качестве маски для наложения LinearLayout. Таким образом, не имеет значения, будет ли выбран селектор - маска всегда будет перекрывать эту проблему.

Мне нужно было найти хороший способ маскировки любого из моих макетов для создания типичных макетов в стиле iOS.

Я написал довольно полный ответ на этот вопрос: Закругленные обрезанные углы Android XML

0 голосов
/ 20 июля 2011

Вы можете реализовать это, используя 9-тональные изображения, используемые в фоновом режиме.Пожалуйста, проверьте документ на сайте Android.

Спасибо

...