首先,我有工作代码在文件中的其他地方执行此操作——这不是问题所在。问题是如何创建可以移动的径向渐变(低于API16)。
抢先一步,我在这里花了很多时间:
http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html
使用GradientDrawable(下图),似乎没有一种方法可以在不设置非径向方向的情况下设置颜色。
public class CustomView extends View {
int width = (sWidth/8); // sWidth defined elsewhere as width of screen
int height = (sWidth/8);
GradientDrawable gradient;
int[] colors = {0x60ffffff,0x000000};
public CustomView(Context context) {
super(context);
gradient = new GradientDrawable(GradientDrawable.Orientation.BL_TR,colors);
}
protected void onDraw(Canvas canvas) {
if(x != 0 && y != 0){ // OnTouch calls invalidate on this view for movement
gradient.mutate();
gradient.setShape(GradientDrawable.RADIAL_GRADIENT);
// This just makes it disappear:
// setGradientType (GradientDrawable.RADIAL_GRADIENT);
gradient.setBounds(x-width/2, y-height/2, x + width, y + height);
gradient.draw(canvas);
}
}
}
还有一点:
http://developer.android.com/reference/android/graphics/RadialGradient.html
但似乎没有办法改变这种梯度。你能把径向梯度放在一个可以移动的透明圆上吗?我不知所措。我提前谢谢你。
最佳答案
编辑:
步骤1,在可绘制文件夹中定义一个椭圆形。这是“cloud.xml”:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<gradient
android:centerX="0.5"
android:centerY="0.5"
android:endColor="#00000000"
android:gradientRadius="30"
android:startColor="#f0ffffff"
android:type="radial" />
<size
android:width="60dp"
android:height="60dp" />
</shape>
半径、宽度和高度可能需要动态更改。所以随便吧。上面的配色方案将为完全透明提供略微透明的颜色。云效应。
步骤2,自定义视图的构造函数:
// actually before the constructor this, of course:
GradientDrawable circle;
// now the constructor:
circle = (GradientDrawable) context.getResources().getDrawable(R.drawable.cloud);
步骤3,OnDraw方法:
// x & y being coordinates updated from onTouch method,
// circleRad being some constant dependent on screen dp
if(x != 0 && y != 0){
circle.setGradientRadius(circleRad);
circle.setBounds(x-circleRad, y-circleRad,
x+circleRad, y+circleRad);
circle.draw(canvas);
}
—————————————————————————————————————————————————————————————————--
再等几个星期,你就可以回答自己的问题了。原来一直都是径向梯度。
public class CustomView extends View implements OnTouchListener {
Shader radialGradientShader;
Paint paint;
private int circleDiam;
private int x = 0;
private int y = 0;
private int lastScreenColor;
public CustomView(Context context, int circleDiam) {
super(context);
this.circleDiam = circleDiam;
paint = new Paint();
}
protected void onDraw(Canvas canvas) {
if(x != 0 && y != 0){
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
radialGradientShader = new
RadialGradient(x, y, circleDiam,
0xf0ffffff,0x00000000,Shader.TileMode.MIRROR);
paint.setShader(radialGradientShader);
canvas.drawCircle(x, y, circleDiam, paint);
}
}
public boolean onTouch(View v, MotionEvent event) {
x = (int)event.getX();
y = (int)event.getY();
if(event.getAction() == MotionEvent.ACTION_DOWN
&& event.getAction() == MotionEvent.ACTION_MOVE){
invalidate();
return true;
}
else{
x = 0;
y = 0;
invalidate();
return false;
}
}
}
蓬松的云!
这个解决方案的唯一问题是,当您在ondraw方法中实例化一个对象时,eclipse会生气。但是,如果您尝试在构造函数中实例化它,事情会变得很糟糕。
为避免上述问题的解决方案额外加分。
关于android - 移动“云”-用手指移动径向渐变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13071060/