1. <span xmlns= "http://www.w3.org/1999/xhtml" style= "" > package yan.guoqi.rectphoto;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.graphics.Paint.Style;
  7. import android.graphics.RectF;
  8. import android.util.AttributeSet;
  9. import android.widget.ImageView;
  10. public class DrawImageView extends ImageView {
  11. private final Paint paint;
  12. private final Context context;
  13. public DrawImageView(Context context, AttributeSet attrs) {
  14. super (context, attrs);
  15. // TODO Auto-generated constructor stub
  16. this .context = context;
  17. this .paint = new Paint();
  18. this .paint.setAntiAlias( true ); //消除锯齿
  19. this .paint.setStyle(Style.STROKE); //绘制空心圆或 空心矩形
  20. }
  21. @Override
  22. protected void onDraw(Canvas canvas) {
  23. // TODO Auto-generated method stub
  24. int center = getWidth()/ 2 ;
  25. int innerCircle = dip2px(context, 83 ); //内圆半径
  26. int ringWidth = dip2px(context, 10 ); //圆环宽度
  27. // 第一种方法绘制圆环
  28. //绘制内圆
  29. this .paint.setARGB( 255 , 138 , 43 , 226 );
  30. this .paint.setStrokeWidth( 2 );
  31. canvas.drawCircle(center, center, innerCircle, this .paint);
  32. //绘制圆环
  33. this .paint.setARGB( 255 , 138 , 43 , 226 );
  34. this .paint.setStrokeWidth(ringWidth);
  35. canvas.drawCircle(center, center, innerCircle + 1 +ringWidth/ 2 , this .paint);
  36. //绘制外圆
  37. this .paint.setARGB( 255 , 138 , 43 , 226 );
  38. this .paint.setStrokeWidth( 2 );
  39. canvas.drawCircle(center, center, innerCircle + ringWidth, this .paint);
  40. super .onDraw(canvas);
  41. }
  42. /* 根据手机的分辨率从 dp 的单位 转成为 px(像素) */
  43. public static int dip2px(Context context, float dpValue) {
  44. final float scale = context.getResources().getDisplayMetrics().density;
  45. return ( int ) (dpValue * scale + 0 .5f);
  46. }
  47. }
  48. </span>

1,这种分三次来绘制的方法,可以将圆环的内圆 圆环 和外圆的颜色设成不一样的,对paint进行三次设置。还可以将绘制圆环的paint透明度设成10左右就会有圆环透明的效果。

2,三次绘制时的canvas.drawCircle圆心都是(center,center),但三次半径确实不一样的。尤其是第二次绘制圆环的时候,半径是innerCircle + 1 +ringWidth/2。这里的加1是第一次外圆paint.setStrokeWidth(2);宽度设成2,也就是说单条线的宽度1。后面的 ringWidth/2也是同理。

示例如下(底色是预览摄像头的视频):

二、 利用canvas.drawArc实现

上文已经绘制了圆环,但仔细分析就知,如果只需要圆环的话,那么只绘制圆环就可以,不用画内圆和外圆了。事实证明也是如此。

但是要做成和下面的圆环透明度不一的效果上面的方法还是达不中:

用drawCircle不中了,经查android提供了绘制圆弧的函数drawArc,参考http://zhidao.baidu.com/question/469977150.html,也可以看这里http://blog.chinaunix.net/uid-23392298-id-3345789.html

canvas.drawArc(new RectF(0, 0, 128, 128), 0, 360, true, new Paint(
Paint.ANTI_ALIAS_FLAG));
参数1:圆的范围大小
参数2:起始角度
参数3:圆心角角度,360为圆,180为半圆
参数4:中心
参数5:画笔Paint,可以设置画线or填充,设置颜色,设置线的粗细等等第四个参数

最关键的是第一个参数RectF,在什么地方绘制圆弧就是由这个矩形的位置确定的。根据上文,这个RectF应该是内切圆弧的外圆(尽管没画,但还是有)。所以其左上点及右下点坐标为:

        RectF rect2 = new RectF(center-(innerCircle + 1 +ringWidth/2),center-(innerCircle + 1 +ringWidth/2), center+(innerCircle + 1 +ringWidth/2), center+(innerCircle + 1 +ringWidth/2));

     为了绘制出透明度不同的圆环分两部来绘制:

this.paint.setARGB(200, 127, 255, 212);
        this.paint.setStrokeWidth(ringWidth);
        //绘制不透明部分
        canvas.drawArc(rect2, 180+startAngle, 90, false, paint);
        canvas.drawArc(rect2, 0+startAngle, 90, false, paint);
        //绘制透明部分
        this.paint.setARGB(30, 127, 255, 212);
        canvas.drawArc(rect2, 90+startAngle, 90, false, paint);
        canvas.drawArc(rect2, 270+startAngle, 90, false, paint);

上面的代码当startAngle = 0时,绘制的是一个静态的透明度交替的圆弧。接着要让它转起来。增加代码:       

     startAngle+=10;
        if(startAngle == 180)
            startAngle = 0;   
 

事实上后两句也可以不增加,仿照前文SurfaceView绘制旋转动画的例子用这种求余的思想,(rotate += 48) % 360,把上面角度也弄个%360,也是可以的。

剩下的事就是让这个东西循环执行了。在super.onDraw(canvas);这句代码后面加 invalidate();就可以了!透明圆环就转起来了。

					canvas.drawCircle(mCirX, mCirY, mRadius, paint);
					paint.setAlpha(0);
					paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));				
					canvas.drawCircle(mCirX, mCirY, mRadius-mRingWidth, paint);
在android中要绘制圆环,暂时知道有三种方式。分别是:一、设置画笔的style为stoke,绘制圆这里是先绘制内圆,然后绘制圆环(圆环的宽度就是paint设置的paint.setStrokeWidth的宽度),最后绘制外圆。请看核心源码:[java] view plaincopyprint?"http://
功能:该方法用于在画布上绘制圆形,通过指定圆形圆心的坐标和半径来实现。该方法是绘制圆形的主要方法,同时也可以通过设置画笔的空心效果来绘制空心的圆形。 基本语法:public void drawCircle (float cx, float cy, float radius, Paint paint) cx:圆心的x坐标。 cy:圆心的y坐标。 radius:
绘制圆弧方法 public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) oval:圆弧所在的椭圆对象。 startAngle:圆弧的起始角度。 sweepAngle:圆弧的角度。 useCenter:是否显示半径连线,true表示显示圆弧与圆心的半径连线,false表示不显示。 paint:绘制时所使用的画笔。
绘制圆环的控件,支持时间设置,角度设置,背景设置等一、使用方法1)在Layout中使用如下声明        android:id="@ id/arc_percent"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         app:radius="100dp"         app:isRing="false"         />其中radus表示半径,isRing表示是否绘制圆环2)初始化参数        ring.setBg(0, 360,Color.rgb(30, 96, 200));//设置圆环背景         ring.setFrontColor(Color.rgb(255, 255, 255));//设置圆环前景         ring.setPrimaryTextParam(primaryTextSize,Color.rgb(255, 255, 255), cpuPercent "%");//设置主标题属性         ring.setSecondryTextParam(secondaryTextSize, Color.rgb(255, 255, 255), "CPU");//设置负标题属性         ring.setRingWidth(ringWidth);3)绘制Ring/**     * @param startAngle开始角度     * @param percent 百分比     * @param radius 半径     * @param totalDrawTime 动画总时间    //绘制圆环    public void drawCircleRing(int startAngle,int percent,int totalDrawTime)    //绘制扇形        public void drawArcRing(int startAngle,  int  percent, int totalDrawTime)
drawCircle方法:绘制圆形 【功能说明】该方法用于在画布上绘制圆形,通过指定圆形圆心的坐标和半径来实现。该方法是绘制圆形的主要方法,同时也可以通过设置画笔的空心效果来绘制空心的圆形。 【基本语法】public void drawCircle (float cx, float cy, float radius
你可以使用pymunk中的`pymunk.util.poly_circle`函数来绘制90°的圆环。该函数用于在一个圆的扇形上绘制一个多边形,从而模拟一个圆弧。您可以指定圆弧的角度,因此可以绘制任意大小的圆弧。下面是一个简单的例子: import pymunk import pymunk.pygame_util import pygame def main(): pygame.init() screen = pygame.display.set_mode((600, 600)) clock = pygame.time.Clock() space = pymunk.Space() circle = pymunk.Circle(space.static_body, 50) circle.body.position = (300, 300) space.add(circle) arc = pymunk.util.poly_circle(circle.body, circle.radius, 0, 90) space.add(arc) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit(0) elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: sys.exit(0) screen.fill((255, 255, 255)) space.debug_draw(pymunk.pygame_util.DrawOptions(screen)) pygame.display.flip() clock.tick(50) if __name__ == '__main__': sys.exit(main()) 上面的代码将绘制一个从0°到90°的圆弧。您可以通过更改第三个和第四个参数来更改圆弧的角度。
【android studio】解决layout预览出现Rendering Problems Exception Unable to find the layout for Action Bar. 25967