Intereting Posts
Тег метаданных не имеет правильного значения ErrnoException: isConnected failed: EHOSTUNREACH (без маршрута к хосту) при изменении сети Wi-Fi с использованием ICS В чем разница, когда я создаю объект Android WebView с помощью ContextWrapper и контекста? Как изменить тему приложения Android? Как удалить нижний разделитель нижнего колонтитула в списке андроидов Получение изображения ThumbNail в Android Храните дополнительные данные в Диспетчере учетных записей Android Margin устанавливается в первую строку textView Лучшая база данных для разработки мобильных телефонов Использование android.app.Fragment с ViewPager в Android 3.0+ Как отключить горизонтальную прокрутку в веб-браузере Android Преобразовать существующий проект в проект Android в Eclipse? Как я действительно использую ffmpeg на Android? Как определить тип дополнительного в пакете, удерживаемом намерением? Возможно добавить заголовок раздела с сервера в списке со списком, чтобы удалить и отменить элемент

Растровое повторение + закругленные углы

Я пытаюсь создать прямоугольник с закругленными углами и фоном как повторяющиеся растровые изображения. Я пишу так, но получаю растровые изображения в углах.

Может ли кто-нибудь помочь?

background.xml

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <stroke android:width="1dp" android:color="#FFFFFF" /> <corners android:radius="50dp" /> </shape> </item> <item> <bitmap android:src="@drawable/carbon_4" android:tileMode="repeat" /> </item> </layer-list> 

Solutions Collecting From Web of "Растровое повторение + закругленные углы"

Как я понимаю цель: иметь мозаичное фоновое изображение с некоторыми изогнутыми углами. Черепичные и изогнутые

Это не совсем идеальный пиксель, но его как можно ближе.

Во-первых, вот некоторые макеты, которые я использую, чтобы нарисовать эту кнопку

the_button.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/wrapper_main" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/bg_curved_tiled" android:padding="20dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Some Text" /> </FrameLayout> 

И thats, используя это в качестве фона

bg_curved_tiled.xml

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@id/layer_needs_rounding"> <bitmap android:src="@drawable/patch" android:tileMode="repeat" /> </item> <item> <shape android:shape="rectangle" android:useLevel="false" > <stroke android:width="3dp" android:color="#666666" /> <solid android:color="@null" /> <corners android:bottomLeftRadius="@dimen/radius_corner_default" android:bottomRightRadius="@dimen/radius_corner_default" android:radius="@dimen/radius_corner_default" android:topLeftRadius="@dimen/radius_corner_default" android:topRightRadius="@dimen/radius_corner_default" /> </shape> </item> </layer-list> 

На этом этапе у вас есть изображение, которое выглядит так:

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

Как вы можете видеть, черепичная растровая карта торчит по углам мимо изогнутой формы, наложенной поверх нее.

Итак, теперь вам нужна функция, которая округляет углы растрового изображения … Я получил это в другом месте в stackoverflow

  public static Bitmap createRoundedCornerBitmap(Context context, Bitmap input, float roundPx, boolean squareTL, boolean squareTR, boolean squareBR, boolean squareBL) { if (input == null) { return null; } final int w = input.getWidth(), h = input.getHeight(); Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, w, h); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); // draw rectangles over the corners we want to be square if (squareTL) { canvas.drawRect(0, 0, w / 2, h / 2, paint); } if (squareTR) { canvas.drawRect(w / 2, 0, w, h / 2, paint); } if (squareBL) { canvas.drawRect(0, h / 2, w / 2, h, paint); } if (squareBR) { canvas.drawRect(w / 2, h / 2, w, h, paint); } paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(input, 0, 0, paint); return output; } 

Почти готово! Я ненавижу эту часть – я не нашел лучшего способа получить объект Bitmap, который имеет в нем фактическое разбитое растровое изображение. Например, BitmapDrawable.getBitmap просто дает вам отдельное патч-растровое изображение, а не черепичное повторное патч-холст … bummer. Поэтому вместо этого я получаю кеш-файл чертежа. Вы должны убедиться, что представление было полностью инициализировано первым (высота и ширина были выровнены и черепичные соответственно), поэтому post в представление и обработка там.

 private void shaveOffCorners(final ViewGroup view) { view.post(new Runnable() { @Override public void run() { // make all child views invisible before scraping the drawing cache SparseIntArray viewStates = new SparseIntArray(); for(int index = 0; index < view.getChildCount(); ++index) { View child = view.getChildAt(index); viewStates.put(index, child.getVisibility()); child.setVisibility(View.INVISIBLE); } view.buildDrawingCache(); // this is the exact bitmap that is currently rendered to screen. hence, we wanted to // hide all the children so that they don't permanently become part of the background final Bitmap rounded = view.getDrawingCache(); // restore actual visibility states after getting the drawing cache for(int index = 0; index < view.getChildCount(); ++index) { View child = view.getChildAt(index); child.setVisibility(viewStates.get(index)); } view.setBackgroundDrawable(new BitmapDrawable( getResources(), MyImageUtil.createRoundedCornerBitmap( view.getContext(), rounded, getResources().getDimensionPixelSize(R.dimen.radius_corner_default), false, true, true, false))); } }); } 

И вот как я это сделал, надеюсь, что это поможет!

Если кто-то знает менее ужасный способ выполнить это, пожалуйста, поделитесь. Кроме того, если кто-нибудь знает, как получить черепичный растровый рисунок, отличный от очищения кеша чертежа, это тоже было бы полезно – все скрытие и восстановление дочерних представлений немного дрябло.

Я нашел это сообщение Роменом Гаем, это гораздо более простой способ округлить углы на черепичном растровом изображении. Вот короткий ответ:

 class CurvedAndTiled extends Drawable { private final float mCornerRadius; private final RectF mRect = new RectF(); private final BitmapShader mBitmapShader; private final Paint mTilePaint; CurvedAndTiled( Bitmap bitmap, float cornerRadius) { mCornerRadius = cornerRadius; mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); mTilePaint = new Paint(); mTilePaint.setAntiAlias(true); mTilePaint.setShader(mBitmapShader); } @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); mRect.set(0, 0, bounds.width(), bounds.height()); } @Override public void draw(Canvas canvas) { canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mTilePaint); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public void setAlpha(int alpha) { mTilePaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { mTilePaint.setColorFilter(cf); } } 

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