2013-12-24 2 views
3

Посмотрите на мой код ниже.Вид с круглыми углами не гладкий

ShapeDrawable shapeDrawable = new ShapeDrawable(new RectShape()); 
    shapeDrawable.getPaint().setColor(Color.parseColor("#5a2705")); 
    shapeDrawable.getPaint().setStyle(Style.STROKE); 
    shapeDrawable.getPaint().setAntiAlias(true); 
    shapeDrawable.getPaint().setStrokeWidth(2); 
    shapeDrawable.getPaint().setPathEffect(new CornerPathEffect(10)); 

Я подаю это как фон к моему LinearLayout, но края не являются гладкими. Как я могу это исправить?

Вот скриншот того, как он выглядит.

enter image description here

+0

Вы пытались использовать 'RoundRectShape' вместо' CornerPathEffect'? – Luksprog

+0

Нет, я его не пробовал, вы можете мне показать? – Goofy

+1

Посмотрите на https://gist.github.com/luksprog/8186419 – Luksprog

ответ

3

Вы можете попробовать создать отдельный файл XML с макетом прямоугольника с закругленными углами. Такие, как:

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="color_here"/> 
    <stroke android:width="5dp" android:color="color_here"/> 
    <corners android:radius="2dp"/> 
</shape> 

Вы можете настроить это по своему вкусу и использовать этот XML-файл в качестве фона в главном XML.

Вы также можете попробовать использовать 9Patch, который должен уже прийти с SDK

1

Чтобы удовлетворить такие требования фонового Я предпочитаю использовать 9-патч вытяжку. Ниже указатель, чтобы начать работать с созданием и использованием 9-патч Drawable ресурсы:

  1. Разработчик Doc: http://developer.android.com/tools/help/draw9patch.html

  2. Другое объяснение: http://radleymarx.com/blog/simple-guide-to-9-patch/

  3. Online tool создать 9-патч изображений , (Примечание: Измените расширение файла *.9.png при сохранении изображения)

+0

Инструмент Online, который вы предложили, БОЛЬШОЕ !! – cmcromance

6

Использование программно созданная форме рисуемого как вид фон приводит к внешней половине вашей ширины штриха получения обрезано (по причинам, я не» t знать). Посмотрите внимательно на свое изображение, и вы увидите, что ваш удар имеет ширину всего в 1 пиксель, хотя вы просили 2. Вот почему углы выглядят уродливо. Этот эффект будет гораздо более очевидным, если вы попробуете больший удар и радиус, такой как 10 и 40 соответственно.

Либо используйте XML-drawable, который, похоже, не имеет этой проблемы, как в ответе Harshit Jain, или выполните следующие действия, если вы (или предпочитаете) использовать программное решение.

Решение: Использование списка слоев на вставке прямоугольник на величину, которая в настоящее время обрезается (половину ширины обводки), как это:

float strokeWidth = 2; 

ShapeDrawable shapeDrawable = new ShapeDrawable(new RectShape()); 
shapeDrawable.getPaint().setColor(Color.parseColor("#5a2705")); 
shapeDrawable.getPaint().setStyle(Style.STROKE); 
shapeDrawable.getPaint().setAntiAlias(true); 
shapeDrawable.getPaint().setStrokeWidth(strokeWidth); 
shapeDrawable.getPaint().setPathEffect(new CornerPathEffect(10)); 

Drawable[] layers = {shapeDrawable}; 
LayerDrawable layerDrawable = new LayerDrawable(layers); 

int halfStrokeWidth = (int)(strokeWidth/2); 
layerDrawable.setLayerInset(0, halfStrokeWidth, halfStrokeWidth, halfStrokeWidth, halfStrokeWidth); 

Затем используйте layerDrawable в качестве фона. Вот снимок экрана результата выше кода:

enter image description here

+0

Это помогло мне много! Должен быть принятый ответ. – Hameno

+0

Спасибо! Я неправильно истолковал проблему, заключающуюся в том, что внешний и внутренний края угла имеют одинаковый радиус, но на самом деле он обрезается. Я использовал drawRoundRect с RectF (0, 0, getWidth(), getHeight()). Решение было таким же: вставить RectF на половину strokeWidth. –

+0

Спасибо @FletcherJohns, имел те же проблемы, но это фиксировало это –

0

Вы можете попробовать использовать селектор, как это. Это решение является лучшим, вам просто нужно установить этот селектор на задний план макета.

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/white" /> 
    <stroke android:width="1dp" android:color="@color/grey" /> 
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> 
    <corners android:radius="15dp" /> 
     <gradient 
      android:angle="90" 
      android:startColor="@color/white" 
      android:centerColor="@color/grey" 
      android:endColor="@color/white" 
      android:type="linear" /> 
</shape> 

Выберите собственный цвет. Приветствия!

1

Возможно, вы захотите рассмотреть checkingthis.

Rounded Image Views Винсом

+1

Это очень помогает в моем опыте. И отличная страница для пользовательского интерфейса. – Toshi

+0

404 Страница не найдена. –

0

Я решил эту проблему в очень простой способ,

Я искал код, который может быть сделано программно, а не через XML,

Вот код :

GradientDrawable shape = new GradientDrawable(); 
    shape.setCornerRadius(10); 
    shape.setColor(Color.WHITE); 
    shape.setStroke(2, Color.parseColor("#996633")); 

Вы можете установить это следующим образом: view.setBackgroundDrawable(shape);

Ответ отправлен @ Tenfour04 также может решить проблему, но я havent пытался как таковой.

Надеюсь, это поможет кому-то.

Смежные вопросы