Я хочу иметь экран с несколькими RelativeLayouts, и я хочу, чтобы верхний макет и нижний макет имели закругленные углы, поэтому верхняя компоновка имела бы верхние 2 угловые закругления, а нижняя компоновка имела бы нижние 2 угловые закругленные,
Моя проблема заключается в том, что все примеры, которые я нахожу в Интернете, используют shape.xml для создания закругленного угла и дают ему градиент, и это недостаточно хорошо, потому что я хочу дать relativeLayout фоновое изображение и изображение округлено, и я не могу сделать оба.
Любая помощь будет очень благодарна!
РЕДАКТИРОВАТЬ - Bounty Started
Хорошо, я много лет стучал головой о стену. В настоящий момент я использую сторонний инструмент под названием UITableView, в основном просто проверяя что-то.
https://github.com/thiagolocatelli/android-uitableview
Он устанавливает tableView аналогично тому, как выглядит таблица iPhone, и я хочу, чтобы каждая строка имела фоновое изображение и имела верхнюю и нижнюю строки изогнутыми. В этом классе UITableView под commit этот код называется
public void commit()
{
mIndexController = 0;
if (mItemList.size() > 1)
{
// when the list has more than one item
for (IListItem obj : mItemList)
{
View tempItemView;
if (mIndexController == 0)
{
//tempItemView = new RoundedView(context_i, this);
tempItemView = mInflater.inflate(R.layout.list_item_top,null);
}
else if (mIndexController == mItemList.size() - 1)
{
tempItemView = mInflater.inflate(R.layout.list_item_bottom,null);
}
else
{
tempItemView = mInflater.inflate(R.layout.list_item_middle,null);
}
setupItem(tempItemView, obj, mIndexController);
tempItemView.setClickable(obj.isClickable());
mListContainer.addView(tempItemView);
mIndexController++;
}
}
else if (mItemList.size() == 1)
{
// when the list has only one item
View tempItemView = mInflater.inflate(R.layout.list_item_single,
null);
IListItem obj = mItemList.get(0);
setupItem(tempItemView, obj, mIndexController);
tempItemView.setClickable(obj.isClickable());
mListContainer.addView(tempItemView);
}
}
У него стиль макета для верхних средних и нижних строк, верхний и нижний округленные используются XML, но проблема в том, что я хочу дать каждой строке изображение. Поэтому я добавил этот код
tempItemView.setBackgroundResource(R.drawable.background);
Но проблема в том, что это удаляет изогнутые углы для верхней и нижней строк, поскольку углы округляются с использованием XML и используют белые градиенты, а не изображение. Мне нужно уметь раздувать макет, а затем наклонять верхний и нижний углы. Я просмотрел так много примеров углов обрезки и даже опробовал различные сторонние инструменты, но еще не нашел один пример, который показывает применение фонового изображения к контейнеру, а затем округление углов.
Есть ли у кого-нибудь идеи о том, как это сделать?
Edit:
На iPhone вы можете сделать что-то вроде этого
UIColor *color = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]];
Где вы конвертируете изображение в цвет. Есть ли у Android эквивалент?
Edit:
Спасибо ACheese за ответ, я изменил его код и разделил его на 3 метода: один для верхних закругленных углов, один для полностью закругленных углов и один для нижних закругленных углов, и придумал этот
public void setBackgroundRounded(int resID, int w, int h, View v)
{
DisplayMetrics metrics = getResources().getDisplayMetrics();
double dH = (metrics.heightPixels / 100) * 1.5;
int iHeight = (int)dH;
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
Shader shader = new BitmapShader(BitmapFactory.decodeResource(
getResources(), resID), Shader.TileMode.MIRROR,
Shader.TileMode.MIRROR);
Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
paint.setAntiAlias(true);
paint.setShader(shader);
RectF rec = new RectF(0, 0, w, h);
c.drawRoundRect(rec, iHeight, iHeight, paint);
v.setBackgroundDrawable(new BitmapDrawable(getResources(), bmp));
}
public void setTopRounded(int resID, int w, int h, View v)
{
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
Shader shader = new BitmapShader(BitmapFactory.decodeResource(
getResources(), resID), Shader.TileMode.MIRROR,
Shader.TileMode.MIRROR);
Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
paint.setAntiAlias(true);
paint.setShader(shader);
RectF rec = new RectF(0, 0, w, h - 20);
c.drawRect(new RectF(0, 20, w, h), paint);
c.drawRoundRect(rec, 20, 20, paint);
v.setBackgroundDrawable(new BitmapDrawable(getResources(), bmp));
}
public void setBottomRounded(int id, int w, int h, View v)
{
DisplayMetrics metrics = getResources().getDisplayMetrics();
double dH = (metrics.heightPixels / 100) * 1.5;
int iHeight = (int)dH;
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
Shader shader = new BitmapShader(BitmapFactory.decodeResource(
getResources(), id), Shader.TileMode.MIRROR,
Shader.TileMode.MIRROR);
Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
paint.setAntiAlias(true);
paint.setShader(shader);
RectF rec = new RectF(0, 0, w, h);
c.drawRoundRect(rec, iHeight, iHeight, paint);
c.drawRect(new RectF(0, 0, w, h-iHeight), paint);
v.setBackgroundDrawable(new BitmapDrawable(getResources(), bmp));
}
Я использую метрики, чтобы настроить, насколько обойти обзор, поэтому он масштабируется с разными размерами экрана.
Надеюсь, что это поможет другим, у кого была эта проблема!