如何在 Canvas 后面设置 CustomView 的背景?
How to set a Background of a CustomView behind the Canvas?
我有一个这样的自定义 View
:
public class ShadowTextView extends TextView {
...
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
final int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
final int minSize = Math.min(parentWidth, parentHeight);
mShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
RadialGradient gradient = new RadialGradient(
parentWidth * mCenterX,
parentHeight * mCenterY,
minSize * mGradientRadiusWidthPercent,
new int[]{mStartColor, mCenterColor, mEndColor},
null,
android.graphics.Shader.TileMode.CLAMP);
mShadow.setDither(true);
mShadow.setShader(gradient);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(0, 0, getWidth(), getHeight(), mShadow);
}
...
}
在 XML 中,我想使用此 CustomView
背景超过我的 Canvas
。
<com.ShadowTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/circle"
android:paddingBottom="3dp"
android:gravity="center"
android:text="+"
android:textColor="@android:color/white"
android:textSize="32dp"
app:startColor="@android:color/black"
app:centerColor="@android:color/black"
app:endColor="@android:color/transparent"
app:gradientRadiusWidthPercent=".5"
/>
circle.xml:
<layer-list>
<item xmlns:android="http://schemas.android.com/apk/res/android"
android:bottom="6dp"
android:left="3dp"
android:right="3dp">
<shape android:shape="oval">
<!--
accentColor might be material red #F44336
-->
<solid android:color="#F44336" />
</shape>
</item>
</layer-list>
Canvas
阴影在前景中,但应该在背景中,这意味着在 android:background="@drawable/circly"
和文本后面。
当前结果:
想要的结果:
最后一条重要提示:
我知道有很多开放的库可以获得浮动操作按钮。请不要推荐我。我想找到我的 "own" 解决方案,所以设计了一个 textView。
解决方案非常简单。通过 XML 定义 'android_background
' 的背景设置是在 draw(...)
– 而不是在 onDraw(...)
– 方法中绘制的。
所以,我所要做的就是在 draw(...)
方法中绘制我的影子,然后调用 super.draw(...)
方法来绘制背景(在我的影子上)。
此外,在 super.draw(...)
方法中调用 onDraw(...)
方法来绘制 TextView
.
的文本
与上面相同的代码,稍作改动:
public class ShadowTextView extends TextView {
...
// overriding of the draw() method instead of the onDraw(...) method
@Override
public void draw(Canvas canvas) {
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), mShadow);
/*
Draw the background setting by XML definition android:background
*/
super.draw(canvas);
}
...
}
感谢您的关心。
我有一个这样的自定义 View
:
public class ShadowTextView extends TextView {
...
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
final int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
final int minSize = Math.min(parentWidth, parentHeight);
mShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
RadialGradient gradient = new RadialGradient(
parentWidth * mCenterX,
parentHeight * mCenterY,
minSize * mGradientRadiusWidthPercent,
new int[]{mStartColor, mCenterColor, mEndColor},
null,
android.graphics.Shader.TileMode.CLAMP);
mShadow.setDither(true);
mShadow.setShader(gradient);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(0, 0, getWidth(), getHeight(), mShadow);
}
...
}
在 XML 中,我想使用此 CustomView
背景超过我的 Canvas
。
<com.ShadowTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/circle"
android:paddingBottom="3dp"
android:gravity="center"
android:text="+"
android:textColor="@android:color/white"
android:textSize="32dp"
app:startColor="@android:color/black"
app:centerColor="@android:color/black"
app:endColor="@android:color/transparent"
app:gradientRadiusWidthPercent=".5"
/>
circle.xml:
<layer-list>
<item xmlns:android="http://schemas.android.com/apk/res/android"
android:bottom="6dp"
android:left="3dp"
android:right="3dp">
<shape android:shape="oval">
<!--
accentColor might be material red #F44336
-->
<solid android:color="#F44336" />
</shape>
</item>
</layer-list>
Canvas
阴影在前景中,但应该在背景中,这意味着在 android:background="@drawable/circly"
和文本后面。
当前结果:
想要的结果:
最后一条重要提示:
我知道有很多开放的库可以获得浮动操作按钮。请不要推荐我。我想找到我的 "own" 解决方案,所以设计了一个 textView。
解决方案非常简单。通过 XML 定义 'android_background
' 的背景设置是在 draw(...)
– 而不是在 onDraw(...)
– 方法中绘制的。
所以,我所要做的就是在 draw(...)
方法中绘制我的影子,然后调用 super.draw(...)
方法来绘制背景(在我的影子上)。
此外,在 super.draw(...)
方法中调用 onDraw(...)
方法来绘制 TextView
.
与上面相同的代码,稍作改动:
public class ShadowTextView extends TextView {
...
// overriding of the draw() method instead of the onDraw(...) method
@Override
public void draw(Canvas canvas) {
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), mShadow);
/*
Draw the background setting by XML definition android:background
*/
super.draw(canvas);
}
...
}
感谢您的关心。