我想达到以下效果。即具有平行四边形背景的TextView。
我不能使用9补丁,因为背景的颜色是动态的。
理想情况是使用已设置背景的自定义TextView。
有没有实现这个目标?
答案 0 :(得分:0)
我最终必须创建一个自定义视图,使用绘制路径为左侧和右侧绘制一个三角形。
然后我必须创建另一个扩展线性布局(或相对布局)的自定义视图,并包括左三角视图,文本视图和右三角视图。三角形大小根据视图的高度调整。三角形的填充颜色与textview的背景颜色相匹配。
这一切似乎运作良好,因为我在很多设备上都没有遇到任何问题。它也是列表视图中列表项的一部分,性能似乎很好。
表示三角形:
公共类LabelTriangleView扩展了View {
private boolean mRightSided = false;
private Paint mMainTrianglePaint;
private int mMainTriangleColor;
public LabelTriangleView(Context context) {
super(context);
intialise();
}
public LabelTriangleView(Context context, AttributeSet attrs) {
super(context, attrs);
intialise();
}
public void setMainColor(int newColor) {
mMainTriangleColor = newColor;
invalidate();
requestLayout();
}
public void setRightSided() {
mRightSided = true;
invalidate();
requestLayout();
}
@Override
protected void onDraw(Canvas canvas) {
mMainTrianglePaint.setColor(mMainTriangleColor);
if (mRightSided) {
canvas.drawPath(getRightSidedPath(), mMainTrianglePaint);
} else {
canvas.drawPath(getLeftSidedPath(), mMainTrianglePaint);
}
}
private void intialise() {
mMainTrianglePaint = new Paint();
mMainTrianglePaint.setStyle(Style.FILL);
mMainTrianglePaint.setAntiAlias(true);
}
private Path getLeftSidedPath() {
Path path = new Path();
path.moveTo(this.getMeasuredWidth(), 0);
path.lineTo(this.getMeasuredWidth(), this.getMeasuredHeight());
path.lineTo(0, this.getMeasuredHeight());
path.close();
return path;
}
private Path getRightSidedPath() {
Path path = new Path();
path.moveTo(0, 0);
path.lineTo(this.getMeasuredWidth(), 0);
path.lineTo(0, this.getMeasuredHeight());
path.close();
return path;
}
}
三角形应足以让任何人开始。我不能在这里发布其余的代码,因为它太复杂而无法删除内容。
但基本上,这就是我所做的:
基本上就是这样!