最近遇见一个需要一个圆盘功能的需求,需要在圆盘中心和上下左右四个方向各添加一个控件,想了想还是用canvas自己来画吧

需要实现下面效果:

贴代码咯:

package com.rimi.healthmanage.view;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.LinearGradient;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.RectF;

import android.graphics.Shader;

import android.util.AttributeSet;

import android.view.View;

import android.view.ViewGroup;

import com.rimi.healthmanage.R;

import com.xxs.sdk.util.InfoUtil;

import com.xxs.sdk.util.ProveUtil;

import com.xxs.sdk.util.TransformUtil;

public class FragmentMainView extends ViewGroup {

private int layoutHeight, layoutWidth;

private int centerX, centerY;

private Shader lnShaderdrawable;

private int circleSmallRadius;

private Paint paint;

private RectF recfBig, recfMidle;

private boolean ifallowdrawArc;

private int sweepAngle;

public FragmentMainView(Context context) {

super(context);

// TODO Auto-generated

constructor stub

setWillNotDraw(false);

}

public FragmentMainView(Context context, AttributeSet attrs)

{

super(context, attrs);

// TODO Auto-generated

constructor stub

setWillNotDraw(false);

}

public FragmentMainView(Context context, AttributeSet attrs, int

defStyle) {

super(context, attrs,

defStyle);

// TODO Auto-generated

constructor stub

setWillNotDraw(false);

}

@Override

protected void onMeasure(int widthMeasureSpec,

int heightMeasureSpec) {

// TODO Auto-generated method

stub

//

InfoUtil为自定义的一个获取屏幕高宽的工具类

layoutHeight = layoutWidth =

InfoUtil.getScreenWidth() > InfoUtil

.getScreenWidth()

? InfoUtil.getScreenWidth() / 3 * 2

:

InfoUtil.getScreenWidth() / 3 * 2;// 设置整个布局的高宽

setMeasuredDimension(layoutWidth,

layoutHeight);

// TODO Auto-generated method

stub

for (int i = 0; i <

getChildCount(); i++) {

View v =

getChildAt(i);

int widthSpec

= 0;

int

heightSpec = 0;

LayoutParams

params = v.getLayoutParams();

if

(params.width > 0) {

widthSpec

= MeasureSpec.makeMeasureSpec(params.width,

MeasureSpec.EXACTLY);

} else if

(params.width == -1) {

widthSpec

= MeasureSpec.makeMeasureSpec(layoutWidth,

MeasureSpec.EXACTLY);

} else if

(params.width == -2) {

widthSpec

= MeasureSpec.makeMeasureSpec(layoutWidth,

MeasureSpec.AT_MOST);

}

if

(params.height > 0) {

heightSpec

= MeasureSpec.makeMeasureSpec(params.height,

MeasureSpec.EXACTLY);

} else if

(params.height == -1) {

heightSpec

= MeasureSpec.makeMeasureSpec(layoutWidth,

MeasureSpec.EXACTLY);

} else if

(params.height == -2) {

heightSpec

= MeasureSpec.makeMeasureSpec(layoutWidth,

MeasureSpec.AT_MOST);

}

v.measure(widthSpec,

heightSpec);

}

}

@Override

protected void onLayout(boolean changed, int l,

int t, int r, int b) {

// TODO Auto-generated method

stub

centerX = layoutWidth / 2;//

得到圆心坐标

centerY = layoutHeight /

2;

//

TransformUtil为一个dp转像素的工具类

circleSmallRadius = layoutWidth

/ 2 - TransformUtil.dip2px(60);// 计算的到中心小圆半径

float left = 0, top = 0;

final int childCount =

getChildCount();

for (int i = 0; i <

childCount; i++) {

final View

mView = getChildAt(i);

Object tag =

mView.getTag();

if

(mView.getVisibility() == GONE

||

(tag == null || !ProveUtil.isNumeric(tag.toString()))) {

continue;

}

int w =

mView.getMeasuredWidth();// 获取View的宽度

int h =

mView.getMeasuredHeight();// 获取View的高度

int index =

Integer.valueOf(tag.toString());

switch

(index) {

case 0://

圆心

left

= centerX - w / 2;

top

= centerY - h / 2;

break;

case 1://

外圆左边

left

= 0;

top

= centerY - h / 2;

break;

case 2://

外圆上边

left

= centerX - w / 2;

top

= 0;

break;

case 3://

外圆右边

left

= layoutWidth - w;

top

= centerY - h / 2;

break;

case 4://

外圆下边

left

= centerX - w / 2;

top

= layoutHeight - h;

break;

default:

break;

}

mView.layout((int)

left, (int) top, (int) left + w, (int) top + h);

}

intMethod();

}

private void intMethod() {

paint = new Paint();

paint.setAntiAlias(true);//

设置消除锯齿

lnShaderdrawable = new

LinearGradient(centerX,

TransformUtil.dip2px(40),

centerX, layoutHeight

-

TransformUtil.dip2px(40), new int[] {

getResources().getColor(R.color.lanse),

getResources().getColor(R.color.danlvse)

}, null,

Shader.TileMode.MIRROR);

recfBig = new

RectF(TransformUtil.dip2px(20), TransformUtil.dip2px(20),

layoutWidth

- TransformUtil.dip2px(20), layoutHeight

-

TransformUtil.dip2px(20));

recfMidle = new

RectF(TransformUtil.dip2px(50),

TransformUtil.dip2px(50),

layoutWidth

-

TransformUtil.dip2px(50), layoutHeight

-

TransformUtil.dip2px(50));

}

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method

stub

super.onDraw(canvas);

drawViewMethod(canvas);//

调用绘制最外层圆盘和中心小圆的方法

drawArcMethod(canvas);//

调用绘制圆弧的方法

}

private void drawViewMethod(Canvas canvas)

{

paint.setShader(null);

paint.setStyle(Style.STROKE);

paint.setColor(getResources().getColor(R.color.baise));

paint.setStrokeWidth(TransformUtil.dip2px(40));

canvas.drawArc(recfBig, 0, 360,

false, paint);

paint.setStyle(Style.FILL);

canvas.drawCircle(centerX,

centerY, circleSmallRadius, paint);

}

public void drawArcMethod(Canvas canvas) {

if (ifallowdrawArc) {

sweepAngle +=

1;//逐渐增减弧度来实现画弧形是的动画

paint.setStyle(Style.STROKE);

paint.setStrokeWidth(TransformUtil.dip2px(20));

paint.setShader(lnShaderdrawable);

if

(sweepAngle > 90) {

canvas.drawArc(recfMidle,

0, 360, false, paint);

ifallowdrawArc

= false;

sweepAngle

= 0;

} else

{

//

paint.setColor(getResources().getColor(R.color.lvse));

canvas.drawArc(recfMidle,

-45, sweepAngle, false, paint);

//

paint.setColor(getResources().getColor(R.color.huangse));

canvas.drawArc(recfMidle,

45, sweepAngle, false, paint);

//

paint.setColor(getResources().getColor(R.color.lanse));

canvas.drawArc(recfMidle,

135, sweepAngle, false, paint);

//

paint.setColor(getResources().getColor(R.color.hongse));

canvas.drawArc(recfMidle,

225, sweepAngle, false, paint);

invalidate();

}

}

}

public void setIfallowdrawArc(boolean

ifallowdrawArc) {

this.ifallowdrawArc =

ifallowdrawArc;

invalidate();

}

}

随便将布局也一并贴出

http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/fragment_main_mainview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginTop="20dp" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:tag="0"

android:text="测试" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:tag="1"

android:text="测试" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:tag="2"

android:text="测试" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:tag="3"

android:text="测试" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:tag="4"

android:text="测试" />

android圆盘布局,Android绘制圆盘控件相关推荐

  1. android控件位置居中,Android 的布局中如何使控件居中

    首先要分两种不同情况,在两种不同的布局方式下:LinearLayout 和RelativeLayout 1. LinearLayout a). android:layout_gravity=" ...

  2. Android 软键盘弹出时把布局顶上去,控件乱套解决方法

    Android 软键盘弹出时把布局顶上去,控件乱套解决方法 参考文章: (1)Android 软键盘弹出时把布局顶上去,控件乱套解决方法 (2)https://www.cnblogs.com/zhuj ...

  3. Android 布局中 如何使控件居中

    首先要分两种不同情况,在两种不同的布局方式下:LinearLayout 和RelativeLayout 1. LinearLayout a). android:layout_gravity=" ...

  4. Android学习笔记(一)——控件布局常用属性

    LinearLayout线性布局 id:为控件指定相应的ID. width:控件的宽度. height:控件的高度. background:背景颜色. Orientation:控件的排列方向(默认是水 ...

  5. android怎么查看方法被谁调用,Android中查看布局文件中的控件(view,id)在哪里被调用(使用)...

    在阅读别人的代码时通常是很痛苦的,有时很想要看一看布局中的控件在哪里被调用了,为之很苦恼 在这里提供一种方法. 复制要查看的控件ID,到R文件中搜索到该ID, 接下来就好办的了,选中ID按下Ctrl鼠 ...

  6. android 3d布局轮播,android 图片/视频混合轮播控件banner

    android 图片/视频混合轮播控件banner 在youth5201314的图片轮播控件做的修改 原作者github地址:https://github.com/youth5201314/banne ...

  7. [Android Studio]掌握Android Studio的五种常见控件和五种常见布局

    目录 一.View和ViewGroup 二.Android的五种常见控件 2.1 文本控件 2.1.1 TextView 2.1.2 EditText 2.2 按钮控件 2.2.1 Button 2. ...

  8. Kotlin 开发Android app(十二):Android布局FrameLayout和ViewPager2控件实现滚动广告栏

    在上一节中我们简单的介绍了RecyclerView 的使用,他是整个开发的重点控件,这一节我们来看看FrameLayout 布局结合ViewPager2,开发一个广告控件. 新模块banner 先创建 ...

  9. android 带清除功能的输入框控件

    今天,看到一个很好的自定义输入框控件,于是记录一下. 效果很好: 一,自定义一个类,名为ClearEditText package com.example.clearedittext;import a ...

  10. Android提供了哪些主要UI控件,Android必备:Android UI控件的了解与学习

    因为工做须要,最近一段时间,须要进行Android App开发的学习,以前简单的进行过Android的了解,对于基本的Android环境的搭建等已经有过整理,一个Android App是由一个或多个A ...

最新文章

  1. Kali Linux 2017中Scapy运行bug解决
  2. python取均匀不重复的随机数
  3. python使用什么来表示不同级别的语句块-Python
  4. 【CyberSecurityLearning 11】OSI与TCP/IP协议簇以及Packet Tracer模拟器
  5. ABP从入门到精通(4):使用基于JWT标准的Token访问WebApi
  6. 如何写一篇合格的论文(清华大学刘知远)
  7. LeetCode-26 删除排序数组中的重复项
  8. 川菜中,你觉得哪道菜能称为“经典之菜”呢?
  9. PAT 乙级 1042. 字符统计(20) Java版
  10. mybatis oracle 多条件批量删除_面试官经常喜欢问的Mybatis经典面试题,值得好好收藏哦!...
  11. Mysql数据库乱码
  12. ubuntu 下载 迅雷
  13. KC伺服舵机四个方向的打包程序
  14. 2007年简历版本。
  15. Excel.Application使用手册(API)
  16. apple pay
  17. C#中Trim的功能介绍
  18. 数商云:把握数字化核心趋势,推动煤炭企业数字化转型布局
  19. mysql的基本内容介绍简书_MySQL 基本内容
  20. 那些年,我们用过最好的视频播放器

热门文章

  1. 当线程在捕捉异常,即使马上杀掉线程,捕捉到异常之后仍然执行异常处理程序...
  2. linux新手记录;可执行文件直接运行
  3. 001.DIV 标签添加滚动条
  4. CoreJavaE10V1P3.10 第3章 Java的基本编程结构-3.10 数组(Arrays)
  5. oracle空值问题
  6. 拓端tecdat|R语言贝叶斯MCMC:用rstan建立线性回归模型分析汽车数据和可视化诊断
  7. 拓端tecdat|python主题建模可视化LDA和T-SNE交互式可视化
  8. (2)评价算法-TOPSIS算法
  9. 华科c语言作业,华中科技大学标准c语言程序设计及应用习题答案
  10. Java网络编程学习笔记