话不多说,情况是这样:ApiDemo大家都熟吧,其中Sweep这个demo大家一定也都看过,即利用SweepGradient这个Shader使圆随着弧度的变换有个渐进色的效果。
现在本人有个想法,即想实现相似于下图中的效果
描述一下本人的效果吧:
1. 缺口的圆环;
2. 圆环颜色渐进(颜色配比在下面代码中还未给出,不影响代码分析);
3. 圆环的刻度(即虚线)稳定;
首先需要强调的是,大家的答案里面千万别给canvas.drawArc()这个答案,这个答案不符合本人的需求,原因是不同的弧度画出的圆环,其刻度是会随意移动的;
再说说本人的思路:即在从圆环的圆心利用画布类的canvas方法ClipPath方法截取本人想要去掉的这段弧度所在的画布
然后再在剩余的画布上画圆形,那么自然截取的图为本人上图中想要达到的效果了。
值得大家注意的是:下面这段代码中,当不给画笔设置SweepGradient属性时,是能够达到圆弧效果,但是这样的话,颜色又不符合上述要求了。
现在本人有个想法,即想实现相似于下图中的效果
描述一下本人的效果吧:
1. 缺口的圆环;
2. 圆环颜色渐进(颜色配比在下面代码中还未给出,不影响代码分析);
3. 圆环的刻度(即虚线)稳定;
首先需要强调的是,大家的答案里面千万别给canvas.drawArc()这个答案,这个答案不符合本人的需求,原因是不同的弧度画出的圆环,其刻度是会随意移动的;
再说说本人的思路:即在从圆环的圆心利用画布类的canvas方法ClipPath方法截取本人想要去掉的这段弧度所在的画布
然后再在剩余的画布上画圆形,那么自然截取的图为本人上图中想要达到的效果了。
值得大家注意的是:下面这段代码中,当不给画笔设置SweepGradient属性时,是能够达到圆弧效果,但是这样的话,颜色又不符合上述要求了。
public class MainActivity extends Activity {
private ImageView mScanImage;
private ImageView mSecondImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}
private static class SampleView extends View {
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private float mRotate;
private Matrix mMatrix = new Matrix();
private Shader mShader;
private boolean mDoTiming;
public SampleView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
float x = 160;
float y = 100;
mShader = new SweepGradient(x, y, new int[] { Color.GREEN,
Color.RED,
Color.BLUE,
Color.GREEN }, null);
mPaint.setShader(mShader);
mPaint.setStyle(Style.STROKE);
PathEffect effect = new DashPathEffect(new float[] { 5, 8, 5, 8}, 1);
mPaint.setPathEffect(effect);
mPaint.setStrokeWidth(10);[/color]
}
@Override protected void onDraw(Canvas canvas) {
Paint paint = mPaint;
float x = 160;
float y = 100;
canvas.drawColor(Color.WHITE);
mMatrix.setRotate(mRotate, x, y);
mShader.setLocalMatrix(mMatrix);
mRotate += 3;
if (mRotate >= 360) {
mRotate = 0;
}
invalidate();
if (mDoTiming) {
long now = System.currentTimeMillis();
for (int i = 0; i < 20; i++) {
canvas.drawCircle(x, y, 80, paint);
}
now = System.currentTimeMillis() - now;
android.util.Log.d("skia", "sweep ms = " + (now/20.));
}
else {
RectF rect = new RectF(x - 80, y - 80, x + 80, y + 80);
Paint paintRect = new Paint();
paintRect.setColor(Color.RED);
paintRect.setStyle(Style.STROKE);
canvas.drawRect(rect, paintRect);
Path path = new Path();
path.addArc(rect, 60, 60);
canvas.clipPath(path);
//canvas.clipPath(path,Op.XOR);
canvas.drawCircle(x, y, 80, paint);
}
}
}
}
这是本人的代码,感觉思路是没错的,原因是单独画带刻度圆弧或单画带颜色渐进的圆都是能实现的。可是加上渐进效果,同时clipPath的时候出现了问题;
代码中31-34行以及61-69行为本人本人在apidemo中sweep这个例子上新增的代码,可是最后实现的效果却是下面这样:
或这样:
急求各路高手大仙帮忙解答;或有更好的方案也望不吝赐教…
高分相送!
解决方案