我希望能够拥有一个包含多个RelativeLayout的屏幕,并且我想让顶部布局和底部布局都有圆角,即顶部布局的上方2个角是圆角,底部布局的下方2个角也是圆角。
我的问题是,我在网上找到的所有示例都使用shape.xml创建了圆角并给它设置了渐变效果,但这还不够好,因为我想给relativeLayout设置一个背景图像,并使该图像具有圆角,但我似乎无法同时实现两者。
任何帮助都将不胜感激!
编辑-开始奖金
好吧,我已经在这个问题上苦苦思索很长时间了。目前我主要在测试一个叫做UITableView的第三方工具,它类似于iPhone中的表格。
https://github.com/thiagolocatelli/android-uitableview
它以与iPhone表格类似的方式设置了tableView,我希望能够给每一行设置一个背景图像,并使顶部和底部行呈弧形。在这个UITableView类中,在提交时调用了以下代码:
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设置了顶部、中部和底部行的布局样式,以及顶部和底部圆角。但问题是,我想为每一行添加一个图像。所以我加入了这段代码。
他已经用XML设置了顶部、中部和底部行的布局样式,以及顶部和底部圆角。但问题是,我想为每一行添加一个图像。所以我加入了这段代码
tempItemView.setBackgroundResource(R.drawable.background);
但问题是,这将删除顶部和底部行的曲线角,因为使用XML和白色渐变来实现圆角,而不是图片。我需要能够填充布局,然后弯曲顶部和底部角。我已经查看了许多剪裁角的示例,甚至尝试了不同的第三方工具,但仍然没有找到一个单独的示例,可以将背景图应用于容器,然后将其角变成圆角。有人有任何关于如何做到这一点的想法吗??
编辑:
在iPhone上,您可以这样做
UIColor *color = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]];
在哪里可以将图像转换为颜色?Android有对应的功能吗?
编辑:
感谢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));
}
我使用指标来设置视图的四舍五入程度,以便它可以根据不同的屏幕尺寸进行缩放。
希望这对那些遇到这个问题的人有所帮助!