gpt4 book ai didi

android - Drawable 不是在 Canvas 上绘制

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:03 33 4
gpt4 key购买 nike

我有一个自定义 View 和一个要在其上绘制的可绘制对象,但由于某种原因,该可绘制对象未在 View 的 Canvas 上绘制自身。以下是可绘制对象的创建方式:

int[] gradientColors=new int[] { 0xFFFF0000,0xFFFFFF00,0xFF00FF00,
0xFF00FFFF,0xFF0000FF,0xFFFF00FF,0xFFFF0000 };
gradient=new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
gradientColors);

这是 onDraw 函数:

@Override protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
int width=canvas.getWidth();
int height=canvas.getHeight();
gradientBitmap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
canvas.setBitmap(gradientBitmap);
gradient.setBounds(0,0,width,height);
gradient.draw(canvas);
}

最佳答案

尝试查看这段代码,它可以帮助您学习如何处理自定义 View 的绘图:

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}

private static class SampleView extends View {
private Rect mRect;
private GradientDrawable mDrawable;

public SampleView(Context context) {
super(context);
setFocusable(true);

mRect = new Rect(0, 0, 220, 120);

/* GradientDrawable.Orientation BL_TR draw the gradient from the bottom-left to the top-right
BOTTOM_TOP draw the gradient from the bottom to the top
BR_TL draw the gradient from the bottom-right to the top-left
LEFT_RIGHT draw the gradient from the left to the right
RIGHT_LEFT draw the gradient from the right to the left
TL_BR draw the gradient from the top-left to the bottom-right
TOP_BOTTOM draw the gradient from the top to the bottom
TR_BL draw the gradient from the top-right to the bottom-left
*/

mDrawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
new int[] { 0xFFFF0000, 0xFF00FF00,
0xFF0000FF });
mDrawable.setShape(GradientDrawable.RECTANGLE);
mDrawable.setGradientRadius((float)(Math.sqrt(2) * 60));
}

static void setCornerRadius(GradientDrawable drawable, float r0,
float r1, float r2, float r3) {
/* setCornerRadii
Specify radii for each of the 4 corners. For each corner,
the array contains 2 values, [X_radius, Y_radius].
The corners are ordered top-left, top-right, bottom-right,
bottom-left
*/
drawable.setCornerRadii(new float[] { r0, r0, r1, r1,
r2, r2, r3, r3 });
}

@Override protected void onDraw(Canvas canvas) {

mDrawable.setBounds(mRect);

float r = 35;

canvas.save();
canvas.translate(10, 10);
mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
setCornerRadius(mDrawable, r, r, 0, 0);
mDrawable.draw(canvas);
canvas.restore();

canvas.translate(0, mRect.height() + 10);
canvas.save();
canvas.translate(10, 10);
mDrawable.setGradientType(GradientDrawable.RADIAL_GRADIENT);
setCornerRadius(mDrawable, 0, 0, r, r);
mDrawable.draw(canvas);
canvas.restore();

canvas.translate(0, mRect.height() + 10);
canvas.save();
canvas.translate(10, 10);
mDrawable.setGradientType(GradientDrawable.SWEEP_GRADIENT);
setCornerRadius(mDrawable, 0, r, r, 0);
mDrawable.draw(canvas);
canvas.restore();


}
}
}

更新

public class MyView extends View {
private static int measuredWidth = 300;
private static int measuredHeight = 300;
private Rect mRect;
private GradientDrawable mDrawable;

public MyView(Context context) {
super(context);
initializeView();


}

public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initializeView();
}

private void initializeView() {

mDrawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
new int[] { 0xFFFF0000,0xFFFFFF00,0xFF00FF00,
0xFF00FFFF,0xFF0000FF,0xFFFF00FF,0xFFFF0000 });
mDrawable.setShape(GradientDrawable.RECTANGLE);
mDrawable.setGradientRadius((float)(Math.sqrt(2) * 60));
}

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
initializeView();
}

@Override protected void onDraw(Canvas canvas) {
mRect = new Rect(0, 0, measuredWidth, measuredHeight);
mDrawable.setBounds(mRect);
canvas.save();
canvas.translate(10, 10);
mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
//setCornerRadius(mDrawable, r, r, 0, 0);
mDrawable.draw(canvas);
canvas.restore();

}

我为你试过了,它基于你的代码并且可以工作,除了我固定了高度和宽度:

关于android - Drawable 不是在 Canvas 上绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10864810/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com