Intereting Posts
Пользовательский интерфейс обновляется, когда мое приложение утрачивает фокус и восстанавливает фокус. Странный вопрос Динамический текст в живых обоях Android Google Maps не отображается в подписанном apk V2 Android On Orientation Change Crash Возможно ли подключить USB-устройство к устройству Android с помощью adb через терминал? Android: Как правильно установить цвет текста для элементов списка в AlertDialog Презентатор MVP неправильно введен Как сохранить изображение в формате JPEG на Android с пользовательским уровнем качества JSON VS простая манипуляция строк для синтаксического анализа HttpRequest в Android Как сделать файл скрытым на SD-карте android? Как обновить TileOverlay без мерцания? AppCompat и EditText разные подчеркивания для разных API Родные объявления Facebook в GridView: MediaView отображает серый прямоугольник «Id не может быть нулевым» – GoogleJsonResponseException 400 Bad Request Приложение Android как услуга без активности

Овальная форма обрезается при создании программно

У меня проблема с отсечением.

Во-первых, я попытался отобразить овальную форму только с Xml. У меня был следующий код:

Рез / рисуем / circle.xml

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <size android:width="240dp" android:height="240dp" /> <solid android:color="#FFFFFF" /> <stroke android:width="2dp" android:color="#EEEEEE" /> </shape> 

* Рез / макет / test.xml

 .... <RelativeLayout android:id="@+id/circle_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" > <ImageView android:src="@drawable/circle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout> .... 

Он отлично работает и дал мне это: Скриншот

Проблема в том, что по разным причинам я должен делать то же самое прогамматически.

У меня есть этот код:

 RelativeLayout layout = (RelativeLayout) findViewById(R.id.circle_layout); ShapeDrawable drawable = new ShapeDrawable(new OvalShape()); drawable.getPaint().setColor(Color.parseColor("#EEEEEE")); drawable.getPaint().setStyle(Style.STROKE); drawable.getPaint().setStrokeWidth(dpToPx(2)); drawable.getPaint().setAntiAlias(true); drawable.setIntrinsicHeight(dpToPx(240)); drawable.setIntrinsicWidth(dpToPx(240)); ImageView iv = new ImageView(this); iv.setImageDrawable(drawable); RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); lp.addRule(RelativeLayout.CENTER_IN_PARENT); iv.setLayoutParams(lp); layout.addView(iv); 

Функция dpToPx:

 private float scale = 0; private float getScale() { if (scale == 0) scale = this.getResources().getDisplayMetrics().densityDpi / 160f; return scale; } public float dpToPx(float dp) { return dp * getScale(); } 

… это должно было дать мне то же самое? Ну, он дал немного больший круг, с верхним, правым, нижним и левым краями. Вот скриншот (тот же регион экрана, что и предыдущий): Screehshot

У кого-то есть идея, что и почему?

Спасибо.

Редактировать:

Если я установил ширину стока на большее значение (12dp), у меня получилось: Скриншот

Я нашел решение на этой странице: http://www.betaful.com/2012/01/programmatic-shapes-in-android/

В Android, когда вы рисуете штрихом, он рисует центр удара по границам фигуры, которую вы рисуете. Как вы можете видеть, штрих обрезается границами изображения. К счастью, вы можете выполнять преобразования на холсте. То, что мы хотим сделать, – это преобразовать нашу форму удара немного меньшим, чем граница, – и для этого есть операция Матрицы!

 matrix.setRectToRect(new RectF(0, 0, canvas.getClipBounds().right, canvas.getClipBounds().bottom), new RectF(strokeWidth/2, strokeWidth/2, canvas.getClipBounds().right - strokeWidth/2, canvas.getClipBounds().bottom - strokeWidth/2), Matrix.ScaleToFit.FILL); 

редактировать

… Лучшее и удобное решение найти в разделе комментариев ссылки:

Как вы можете видеть в документах Android, форма Drawable в ресурсах фактически сопоставляется с GradientDrawable, а не с ShapeDrawable:

Итак, у меня есть следующий код:

 GradientDrawable drawable = new GradientDrawable(); drawable.setColor(Color.TRANSPARENT); drawable.setShape(GradientDrawable.OVAL); drawable.setStroke((int)cET.dpToPx(2), Color.parseColor("#EEEEEE")); drawable.setSize((int)cET.dpToPx(240), (int)cET.dpToPx(240)); 

Вы используете setIntrinsicHeight, попробуйте установить его в Height / With – strokeWidth, поэтому в этом случае установите ширину и высоту 238.

Вы должны удалить это:

  drawable.getPaint().setStrokeWidth(dpToPx(2)); 

У меня была такая же проблема отсечения, и эта простая конфигурация дала мне вид, который мне нужен без каких-либо обрезков:

redring.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="@android:color/transparent" /> <stroke android:width="2dp" android:color="#ff00" /> </shape> 

Применение:

 <View android:layout_width="100dp" android:layout_height="100dp" android:background="@drawable/redring" />