Как создать ListView с закругленными углами в Android?
Как создать ListView с закругленными углами в Android?
10 ответов
вот один из способов сделать это (благодаря документации Android, хотя!):
добавьте следующее в файл (скажем, customshape.xml), а затем поместите его в (res/drawable / customshape.в XML)
<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle"> 
     <gradient 
         android:startColor="#SomeGradientBeginColor"
         android:endColor="#SomeGradientEndColor" 
         android:angle="270"/> 
    <corners 
         android:bottomRightRadius="7dp" 
         android:bottomLeftRadius="7dp" 
         android:topLeftRadius="7dp" 
         android:topRightRadius="7dp"/> 
</shape> 
как только вы закончите с созданием этого файла, просто установите фон одним из следующих способов:
Через Код:
listView.setBackgroundResource(R.drawable.customshape);
через XML, просто добавьте следующий атрибут в контейнер (ex: LinearLayout или к любым полям):
android:background="@drawable/customshape"
надеюсь, кто-то найдет это полезным...
хотя это сработало, он также вынул весь цвет фона. Я искал способ сделать только границу и просто заменить этот XML-код макета на этот, и мне было хорошо идти!
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="4dp" android:color="#FF00FF00" />
    <padding android:left="7dp" android:top="7dp"
            android:right="7dp" android:bottom="7dp" />
    <corners android:radius="4dp" />
</shape> 
@kris-van-bael
для тех, у кого есть проблемы с выделением выделения для верхней и нижней строки, где отображается прямоугольник фона при выделении, вам нужно установить селектор для listview в прозрачный цвет.
listView.setSelector(R.color.transparent);
цвета.xml просто добавьте следующее -
<color name="transparent">#00000000</color>
другие ответы очень полезны, спасибо авторам!
но я не видел, как настроить прямоугольник при выделении элемента при выборе, а не отключить выделение @alvins @bharat dojeha.
следующие работы для меня, чтобы создать контейнер элемента округленного списка без контура и более светлого серого цвета при выборе той же формы:
ваш XML должен содержать селектор, например ( в res / drawable / customshape.XML-код):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" >
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <stroke android:width="8dp" android:color="@android:color/transparent" />
        <padding android:left="14dp" android:top="14dp"
                android:right="14dp" android:bottom="14dp" />
        <corners android:radius="10dp" />
        <gradient 
             android:startColor="@android:color/background_light"
             android:endColor="@android:color/transparent" 
             android:angle="225"/> 
    </shape>
</item>
<item android:state_pressed="false">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <stroke android:width="8dp" android:color="@android:color/transparent" />
        <padding android:left="14dp" android:top="14dp"
                android:right="14dp" android:bottom="14dp" />
        <corners android:radius="10dp" />
        <gradient 
             android:startColor="@android:color/darker_gray"
             android:endColor="@android:color/transparent" 
             android:angle="225"/> 
    </shape>        
</item>
затем вам нужно реализовать адаптер список и переопределить метод getView, чтобы установить пользовательский селектор в качестве фона
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //snip
        convertView.setBackgroundResource(R.drawable.customshape);
        //snip
    }
и нужно также "скрыть" прямоугольник селектора по умолчанию e.g в onCreate (я также скрываю тонкую серую разделительную линию между элементами):
listView.setSelector(android.R.color.transparent);
listview.setDivider(null);
этот подход решает общее решение для drawables, а не только ListViewItem с различными состояниями выбора.
обновление
решение в эти дни заключается в использовании CardView с поддержкой для округленных углов построенных внутри.
оригинальный ответ*
другим способом, который я нашел, было замаскировать ваш макет, нарисовав изображение поверх макета. Это может тебе помочь. Проверьте Android XML закругленные обрезанные углы
еще одно решение для выделения проблем с первыми и последними элементами в списке:
добавить заполнение в верхней и нижней части фона списка, равного или больше радиуса. Это гарантирует, что выделение выделения не перекрывается с угловыми кривыми.
Это самое простое решение, когда вам нужны непрозрачные выделения.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@color/listbg" />
    <stroke
        android:width="2dip"
        android:color="#D5D5D5" />
    <corners android:radius="10dip" />
    <!-- Make sure bottom and top padding match corner radius -->
    <padding
        android:bottom="10dip"
        android:left="2dip"
        android:right="2dip"
        android:top="10dip" />
</shape>
на самом деле, я думаю, что лучше всего описано по этой ссылке:
http://blog.synyx.de/2011/11/android-listview-with-rounded-corners/
короче говоря, он использует другой фон для верхнего, среднего и нижнего элементов, так что верхний и Нижний будут округлены.
это было невероятно удобно для меня. Я хотел бы предложить еще один обходной путь, чтобы идеально выделить закругленные углы, если вы используете свой собственный CustomAdapter.
определение XML-файлов
прежде всего, перейдите в папку drawable и создайте 4 разных фигуры:
- 
shape_top <gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="270"/> <corners android:topLeftRadius="10dp" android:topRightRadius="10dp"/>
- 
shape_normal <gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="270"/> <corners android:topLeftRadius="10dp" android:topRightRadius="10dp"/>
- 
shape_bottom <gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="270"/> <corners android:bottomRightRadius="10dp" android:bottomRightRadius="10dp"/>
- 
shape_rounded <gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="270"/> <corners android:topLeftRadius="10dp" android:topRightRadius="10dp" android:bottomRightRadius="10dp" android:bottomRightRadius="10dp"/>
Теперь создайте другой макет строки для каждой фигуры, т. е. для shape_top :
- 
вы также можете сделать это программно изменяя фон. <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="20dp" android:layout_marginRight="10dp" android:fontFamily="sans-serif-light" android:text="TextView" android:textSize="22dp" /> <TextView android:id="@+id/txtValue1" android:layout_width="match_parent" android:layout_height="48dp" android:textSize="22dp" android:layout_gravity="right|center" android:gravity="center|right" android:layout_marginLeft="20dp" android:layout_marginRight="35dp" android:text="Fix" android:scaleType="fitEnd" />
и определите селектор для каждого shaped-list, т. е. для shape_top:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Selected Item -->
    <item android:state_selected="true"
        android:drawable="@drawable/shape_top" />
    <item android:state_activated="true"
        android:drawable="@drawable/shape_top" />
    <!-- Default Item -->
    <item android:state_selected="false"
        android:drawable="@android:color/transparent" />
</selector>
измените свой CustomAdapter
наконец, определите параметры макета внутри вашего CustomAdapter:
if(position==0)
{
 convertView = mInflater.inflate(R.layout.list_layout_top, null);
}
else
{
 convertView = mInflater.inflate(R.layout.list_layout_normal, null);
}
if(position==getCount()-1)
{
convertView = mInflater.inflate(R.layout.list_layout_bottom, null);
}
if(getCount()==1)
{
convertView = mInflater.inflate(R.layout.list_layout_unique, null);
}
и это готово!
чтобы сделать границу u, нужно сделать другой xml-файл со свойством solid и corners в папке drawable и вызвать его в фоновом режиме
Я использую пользовательский вид, который я размещаю поверх других, и который просто рисует 4 маленьких угла в том же цвете, что и фон. Это работает независимо от содержимого представления и не выделяет много памяти.
public class RoundedCornersView extends View {
    private float mRadius;
    private int mColor = Color.WHITE;
    private Paint mPaint;
    private Path mPath;
    public RoundedCornersView(Context context) {
        super(context);
        init();
    }
    public RoundedCornersView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
        TypedArray a = context.getTheme().obtainStyledAttributes(
                attrs,
                R.styleable.RoundedCornersView,
                0, 0);
        try {
            setRadius(a.getDimension(R.styleable.RoundedCornersView_radius, 0));
            setColor(a.getColor(R.styleable.RoundedCornersView_cornersColor, Color.WHITE));
        } finally {
            a.recycle();
        }
    }
    private void init() {
        setColor(mColor);
        setRadius(mRadius);
    }
    private void setColor(int color) {
        mColor = color;
        mPaint = new Paint();
        mPaint.setColor(mColor);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);
        invalidate();
    }
    private void setRadius(float radius) {
        mRadius = radius;
        RectF r = new RectF(0, 0, 2 * mRadius, 2 * mRadius);
        mPath = new Path();
        mPath.moveTo(0,0);
        mPath.lineTo(0, mRadius);
        mPath.arcTo(r, 180, 90);
        mPath.lineTo(0,0);
        invalidate();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        /*Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawRect(0, 0, mRadius, mRadius, paint);*/
        int w = getWidth();
        int h = getHeight();
        canvas.drawPath(mPath, mPaint);
        canvas.save();
        canvas.translate(w, 0);
        canvas.rotate(90);
        canvas.drawPath(mPath, mPaint);
        canvas.restore();
        canvas.save();
        canvas.translate(w, h);
        canvas.rotate(180);
        canvas.drawPath(mPath, mPaint);
        canvas.restore();
        canvas.translate(0, h);
        canvas.rotate(270);
        canvas.drawPath(mPath, mPaint);
    }
}
