android圆盘布局,Android绘制圆盘控件
最近遇见一个需要一个圆盘功能的需求,需要在圆盘中心和上下左右四个方向各添加一个控件,想了想还是用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绘制圆盘控件相关推荐
- android控件位置居中,Android 的布局中如何使控件居中
首先要分两种不同情况,在两种不同的布局方式下:LinearLayout 和RelativeLayout 1. LinearLayout a). android:layout_gravity=" ...
- Android 软键盘弹出时把布局顶上去,控件乱套解决方法
Android 软键盘弹出时把布局顶上去,控件乱套解决方法 参考文章: (1)Android 软键盘弹出时把布局顶上去,控件乱套解决方法 (2)https://www.cnblogs.com/zhuj ...
- Android 布局中 如何使控件居中
首先要分两种不同情况,在两种不同的布局方式下:LinearLayout 和RelativeLayout 1. LinearLayout a). android:layout_gravity=" ...
- Android学习笔记(一)——控件布局常用属性
LinearLayout线性布局 id:为控件指定相应的ID. width:控件的宽度. height:控件的高度. background:背景颜色. Orientation:控件的排列方向(默认是水 ...
- android怎么查看方法被谁调用,Android中查看布局文件中的控件(view,id)在哪里被调用(使用)...
在阅读别人的代码时通常是很痛苦的,有时很想要看一看布局中的控件在哪里被调用了,为之很苦恼 在这里提供一种方法. 复制要查看的控件ID,到R文件中搜索到该ID, 接下来就好办的了,选中ID按下Ctrl鼠 ...
- android 3d布局轮播,android 图片/视频混合轮播控件banner
android 图片/视频混合轮播控件banner 在youth5201314的图片轮播控件做的修改 原作者github地址:https://github.com/youth5201314/banne ...
- [Android Studio]掌握Android Studio的五种常见控件和五种常见布局
目录 一.View和ViewGroup 二.Android的五种常见控件 2.1 文本控件 2.1.1 TextView 2.1.2 EditText 2.2 按钮控件 2.2.1 Button 2. ...
- Kotlin 开发Android app(十二):Android布局FrameLayout和ViewPager2控件实现滚动广告栏
在上一节中我们简单的介绍了RecyclerView 的使用,他是整个开发的重点控件,这一节我们来看看FrameLayout 布局结合ViewPager2,开发一个广告控件. 新模块banner 先创建 ...
- android 带清除功能的输入框控件
今天,看到一个很好的自定义输入框控件,于是记录一下. 效果很好: 一,自定义一个类,名为ClearEditText package com.example.clearedittext;import a ...
- Android提供了哪些主要UI控件,Android必备:Android UI控件的了解与学习
因为工做须要,最近一段时间,须要进行Android App开发的学习,以前简单的进行过Android的了解,对于基本的Android环境的搭建等已经有过整理,一个Android App是由一个或多个A ...
最新文章
- Kali Linux 2017中Scapy运行bug解决
- python取均匀不重复的随机数
- python使用什么来表示不同级别的语句块-Python
- 【CyberSecurityLearning 11】OSI与TCP/IP协议簇以及Packet Tracer模拟器
- ABP从入门到精通(4):使用基于JWT标准的Token访问WebApi
- 如何写一篇合格的论文(清华大学刘知远)
- LeetCode-26 删除排序数组中的重复项
- 川菜中,你觉得哪道菜能称为“经典之菜”呢?
- PAT 乙级 1042. 字符统计(20) Java版
- mybatis oracle 多条件批量删除_面试官经常喜欢问的Mybatis经典面试题,值得好好收藏哦!...
- Mysql数据库乱码
- ubuntu 下载 迅雷
- KC伺服舵机四个方向的打包程序
- 2007年简历版本。
- Excel.Application使用手册(API)
- apple pay
- C#中Trim的功能介绍
- 数商云:把握数字化核心趋势,推动煤炭企业数字化转型布局
- mysql的基本内容介绍简书_MySQL 基本内容
- 那些年,我们用过最好的视频播放器
热门文章
- 当线程在捕捉异常,即使马上杀掉线程,捕捉到异常之后仍然执行异常处理程序...
- linux新手记录;可执行文件直接运行
- 001.DIV 标签添加滚动条
- CoreJavaE10V1P3.10 第3章 Java的基本编程结构-3.10 数组(Arrays)
- oracle空值问题
- 拓端tecdat|R语言贝叶斯MCMC:用rstan建立线性回归模型分析汽车数据和可视化诊断
- 拓端tecdat|python主题建模可视化LDA和T-SNE交互式可视化
- (2)评价算法-TOPSIS算法
- 华科c语言作业,华中科技大学标准c语言程序设计及应用习题答案
- Java网络编程学习笔记