大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
12345
创新互联公司是专业的百色网站建设公司,百色接单;提供网站建设、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行百色网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
要实现这个方法,我们要传5个参数进去。
第一个参数:RectF oval
oval 参数的作用是:定义的圆弧的形状和大小的范围
/**
* 这是一个居中的圆
*/
float x = (getWidth() - getHeight() / 2) / 2;
float y = getHeight() / 4;
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y); 1234567812345678
第二个参数:float startAngle
这个参数的作用是设置圆弧是从哪个角度来顺时针绘画的
canvas.drawArc(oval,-90,120,false,mPaint);11
canvas.drawArc(oval,90,110,false,mPaint);11
//设置为-180的时候也是这样
canvas.drawArc(oval,180,140,false,mPaint);1212
//设置为360的时候也是这样
canvas.drawArc(oval,0,140,false,mPaint);1212
第三个参数:float sweepAngle
这个参数的作用是设置圆弧扫过的角度
我们从上面的代码就可以知道其中的作用了
第四个参数:boolean useCenter
这个参数的作用是设置我们的圆弧在绘画的时候,是否经过圆形
值得注意的是,这个参数在我们的 mPaint.setStyle(Paint.Style.STROKE); 设置为描边属性的时候,是看不出效果的。
/**
*这里我是偷懒了,建议不要在onDraw()方法里初始化对象
*/
Paint p = new Paint();//这个是画矩形的画笔,方便大家理解这个圆弧
p.setStyle(Paint.Style.STROKE);
p.setColor(Color.RED);
mPaint.setAntiAlias(true);//取消锯齿
mPaint.setStyle(Paint.Style.FILL);//设置画圆弧的画笔的属性为描边(空心),个人喜欢叫它描边,叫空心有点会引起歧义
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setColor(Color.CYAN);
/**
* 这是一个居中的圆
*/
float x = (getWidth() - getHeight() / 2) / 2;
float y = getHeight() / 4;
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y);
canvas.drawArc(oval,360,140,false,mPaint);//画圆弧,这个时候,绘制没有经过圆心
canvas.drawRect(oval, p);//画矩形12345678910111213141516171819202122231234567891011121314151617181920212223
//当我们设置为true的时候,绘制的时候就经过圆心了
canvas.drawArc(oval,360,140,true,mPaint);1212
第五个参数:Paint paint
这个参数的作用是设置我们的画笔对象的属性
mPaint.setAntiAlias(true);//取消锯齿
mPaint.setStyle(Paint.Style.FILL);//设置画圆弧的画笔的属性为描边(空心),个人喜欢叫它描边,叫空心有点会引起歧义
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setColor(Color.CYAN);12341234
这里还是要强调一下,当 p.setStyle(Paint.Style.STROKE)的时候,我们的第四个参数boolean useCenter,是看不到效果的。
下面是代码全文
public class CustomProgress extends View{
private Paint mPaint;
/**
* 圆的宽度
*/
private int mCircleWidth = 3;
public CustomProgress(Context context) {
this(context, null);
}
public CustomProgress(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
mPaint.setAntiAlias(true);//取消锯齿
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setColor(Color.CYAN);
/**
* 这是一个居中的圆
*/
float x = (getWidth() - getHeight() / 2) / 2;
float y = getHeight() / 4;
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y);
canvas.drawArc(oval,360,140,true,mPaint);
}
画圆角矩形
建立 rect_gray.xml文件放在drawable文件夹下面。
shape xmlns:android=""
android:shape="rectangle"
然后在布局的xml里面:
作为ImageView或者Linearlayout等作为背景源就可以了。
LinearLayout
android:id="@+id/activity_myhezu_wantchuzu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/myhezu_dottedline_rect_green"
android:orientation="horizontal"
最近在做自定义控件,偏展示的那种,视觉出的花里胡哨的,没有现成的,只好自己画。
View 提供了一个 onDraw 方法,
画布 这是画画的地方,系统已经为我们提供好了,就是 onDraw 方法的入参 Canvas 类对象。
画笔 画画的时候有可能只用一支铅笔,有可能用到好几种笔刷。在 Android 里可以用 Paint 类对象来表示,并且画笔是可以带颜色的,就像蜡笔一样五颜六色。
颜料 如果画的是油画或者水彩,笔刷需要配着颜料才能画出颜色。在 Android 里省去了这步,可以直接在 Paint 对象设置颜色,这样画笔就带上了颜色。
小画家 当然是我们啦,想画啥画啥。
Android 坐标系 以我们面对这屏幕,左上角为坐标原点,向右为 x 轴正方向,向下为 y 轴正方向。还有涉及到角度时,请拿出我们的左手,竖起大拇指,握起其他手指,放在手机屏幕上,大拇指朝向就是 z 轴正方向,其他手指握起的方向就是角度的正方向,以 x 轴的正半轴为 0 度角,转到 y 轴正半轴就是 90 度。(其实就是顺时针方向,与极坐标系相反)
系统提供了一些基本的形状绘画功能,画线,画圆,写个字,描个点等等,当然系统也提供了画圆弧的方法。虽然现实中,画什么东西是我们小画家在操作,但在 Android 交给了 Canvas 来负责,(也就是 Canvas 类提供了这些功能方法)我们小画家只要告诉 Canvas 对象要画什么就可以了。
区域范围 正如 drawArc 方法入参提到的,应该画任何东西都要确定一个位置和范围,这个范围应该小于等于整个画布,但画布感觉是无边际的(虽然手机屏幕只有这么大,但画布应该是可以超出屏幕),所以画某个具体图形的范围也可以无限大,只不过实际都会指定一个可见范围,不然意义就不大了。
这个区域范围可以用 RectF 类表示,也可以用 左,上,右,下四个值来限定。其实这个区域范围有点类似 PS 的选区,框选某个范围后,只有那个区域画画才生效,超出了边界,再怎么画也是看不到的。当然,Android 的这个区域范围可能还影响这最终画出来的图形形状。
再来说下渐变色的实现。系统提供了 Shader 类来控制颜色的变化,渐变也算一种。像如果需要给圆弧设置颜色渐变就可以用 Shader 的子类 SweepGradient。
最后,会画圆弧了,可以用来表示什么呢?例如,油表盘,刻度盘,环形进度条(当然这个现成的也有)等等。
简单的思路是画两个圈 取出圆环,然后设置背景色 根据实际进度进行渲染
下面的链接是相关的视频教程 希望可以帮到你
public class XChartCalc {
//Position位置
private float posX = 0.0f;
private float posY = 0.0f;
public XChartCalc()
{
}
//依圆心坐标,半径,扇形角度,计算出扇形终射线与圆弧交叉点的xy坐标
public void CalcArcEndPointXY(float cirX, float cirY, float radius, float cirAngle){
//将角度转换为弧度
float arcAngle = (float) (Math.PI * cirAngle / 180.0);
if (cirAngle 90)
{
posX = cirX + (float)(Math.cos(arcAngle)) * radius;
posY = cirY + (float)(Math.sin(arcAngle)) * radius;
}
else if (cirAngle == 90)
{
posX = cirX;
posY = cirY + radius;
}
else if (cirAngle 90 cirAngle 180)
{
arcAngle = (float) (Math.PI * (180 - cirAngle) / 180.0);
posX = cirX - (float)(Math.cos(arcAngle)) * radius;
posY = cirY + (float)(Math.sin(arcAngle)) * radius;
}
else if (cirAngle == 180)
{
posX = cirX - radius;
posY = cirY;
}
else if (cirAngle 180 cirAngle 270)
{
arcAngle = (float) (Math.PI * (cirAngle - 180) / 180.0);
posX = cirX - (float)(Math.cos(arcAngle)) * radius;
posY = cirY - (float)(Math.sin(arcAngle)) * radius;
}
else if (cirAngle == 270)
{
posX = cirX;
posY = cirY - radius;
}
else
{
arcAngle = (float) (Math.PI * (360 - cirAngle) / 180.0);
posX = cirX + (float)(Math.cos(arcAngle)) * radius;
posY = cirY - (float)(Math.sin(arcAngle)) * radius;
}
}
//////////////
public float getPosX() {
return posX;
}
public float getPosY() {
return posY;
}
在外层比句内镶嵌 android.support.v4.widget.SwipeRefreshLayout
即可实现下拉刷新 有圆弧状;