Intereting Posts
Как обновить версию Android 2.3.6 Как уведомить пользователя, когда он входит в какой-либо регион с использованием Geoloqi API? Как получить местоположение ячейки LTE в android? Android как сохранить большой список <String > во время запуска приложения Android: намерение галереи возвращает resultCode == RESULT_CANCELED ScheduledExecuterService.scheduleAtFixedRate создает несколько пулов потоков – Android Почему мой FFT дает отличный результат визуализации, чем Windows Media Player? Доступ к именам контактных групп Android Отправить электронную почту программно в Android Android пустой экран на onBack в loadDataWithBaseURL Загрузить файл somefile.html из внутреннего хранилища в веб-приложение приложения Как избежать автоматического появления клавиатуры Android при запуске активности Тема Android Dialog делает значок слишком светлым Файл R.java не обновляется с идентификатором элемента интерфейса Видеопоток для Android видеороликов mms и m3u8

Пользовательский вариант с ImageView

У меня уже есть «ImageView» с этими параметрами:

android:layout_width="wrap_content" android:layout_height="wrap_content" 

И установить пользовательский Drawable :

 public class HexDrawable extends Drawable { private Path hexagonPath; private float mWidth, mHeight; private int mBackgroundColor; private int mStrokeColor; private int mStrokeWidth; public HexDrawable(){ init(); } public void setBackgroundColor(int color) { mBackgroundColor = color; } public void setStrokeWidth(int width) { mStrokeWidth = width; } public void setStrokeColor(int color) { mStrokeColor = color; } @Override public int getIntrinsicHeight() { return 60; } @Override public int getIntrinsicWidth() { return 60; } private void init() { hexagonPath = new Path(); mBackgroundColor = Color.BLUE; mStrokeColor = Color.GREEN; mStrokeWidth = 4; } private void calculatePath() { float p = mStrokeWidth / 2; float w = mWidth - 2 * p; float h = mHeight - 2 * p; float r = h / 2; float a = (float) (r / Math.sqrt(3)); PointF X = new PointF(p + a + r / 2, p); PointF Y = new PointF(p + a + r , p); PointF A = new PointF(p + a, p + 0f); PointF B = new PointF(p + 0f, p + r); PointF C = new PointF(p + a, p + 2 * r); PointF D = new PointF(p + w - a, p + 2 * r); PointF E = new PointF(p + w, p + r); PointF F = new PointF(p + w - a, p + 0); hexagonPath.moveTo(Yx, Yy); hexagonPath.lineTo(Ax, Ay); hexagonPath.lineTo(Bx, By); hexagonPath.lineTo(Cx, Cy); hexagonPath.lineTo(Dx, Dy); hexagonPath.lineTo(Ex, Ey); hexagonPath.lineTo(Fx, Fy); hexagonPath.lineTo(Xx, Xy); } @Override protected void onBoundsChange(Rect bounds) { mWidth = bounds.width(); mHeight = bounds.height(); calculatePath(); } @Override public void draw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(mStrokeColor); // set the color paint.setStrokeWidth(mStrokeWidth); // set the size paint.setDither(true); // set the dither to true paint.setStyle(Paint.Style.STROKE); // set to STOKE paint.setStrokeJoin(Paint.Join.ROUND); // set the join to round you want paint.setStrokeCap(Paint.Cap.ROUND); // set the paint cap to round too paint.setPathEffect(new CornerPathEffect(mStrokeWidth)); // set the path effect when they join. paint.setAntiAlias(true); canvas.drawPath(hexagonPath, paint); canvas.clipPath(hexagonPath, Region.Op.INTERSECT); canvas.drawColor(mBackgroundColor); canvas.drawPath(hexagonPath, paint); canvas.save(); } @Override public void setAlpha(int alpha) { } @Override public void setColorFilter(ColorFilter colorFilter) { } @Override public int getOpacity() { return 0; } } 

Кажется, что ImageView использует всю ширину в этом случае.

Как правильно использовать Drawable чтобы использовать его с ImageView ?

Корнем проблемы был режим клипа.

Его лучше использовать canvas.clipPath(hexagonPath, Region.Op.REPLACE);

Кроме того, пример вопроса хорошо работает с ImageView, но после глубоких исследований я выяснил, что в android 5.0 и выше этот drawable используется в drawableLeft в TextView . Также не нужно переопределять getIntrinsicHeight

Ваш код абсолютно правильный:

Введите описание изображения здесь

Вот как я заполняю ImageViewonCreate() активности):

 ((ImageView)findViewById(R.id.hexImageView)).setImageDrawable(new HexDrawable()); 

Макет Activity на скриншоте:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <ImageView android:id="@+id/hexImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </FrameLayout> 

Если я заменил значение wrap_content значением, шестиугольник, как и ожидалось, изменит его размер.

Протестировано на Android 6.0 и 4.3.

Только один совет – вместо жестко getIntrinsicHeight() значений в getIntrinsicHeight() и getIntrinsicWidth() может быть лучше использовать dimens вместо этого.