自定义View手表 时分秒
来源:互联网 发布:淘宝债券公司诈骗 编辑:程序博客网 时间:2024/04/30 11:18
直接上图和贴代码了。
MyClock.java
package barry.defineview;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.os.Handler;import android.os.Message;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;import java.util.Date;/** * @author:BarryYang on 2017/11/3 * @Email:barry.yang@gaopeng.com * @Description:时钟 */public class MyClock extends View { private Paint mPaint; private int len = 0; private String author; private float authorSize; private int authorColor; public MyClock(Context context, @Nullable AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyClock); author = a.getString(R.styleable.MyClock_author); authorColor = a.getColor(R.styleable.MyClock_author_color,getResources().getColor(R.color.colorPrimary)); authorSize = a.getDimension(R.styleable.MyClock_author_size,14); a.recycle(); initView(); } private void initView() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.STROKE); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = dip2px(getContext(),200); int height = dip2px(getContext(),200); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } len = Math.min(width, height); setMeasuredDimension(len, len); } @Override protected void onDraw(Canvas canvas) { int radius = len / 2; canvas.drawCircle(radius, radius, radius, mPaint); Paint textPaint = new Paint(); textPaint.setColor(authorColor); textPaint.setTextSize(authorSize); textPaint.setAntiAlias(true); Rect rect = new Rect(); textPaint.getTextBounds(author, 0, author.length(), rect); canvas.drawText(author, len / 2 - rect.width() / 2, len / 4, textPaint); //绘制中间圆点 Paint pointPaint = new Paint(); pointPaint.setColor(Color.BLACK); pointPaint.setAntiAlias(true); canvas.drawCircle(radius, radius, 5, pointPaint); //绘制小时的刻度线,一共12条 int hourCount = 12; //每次绘制小时刻度线旋转的角度 float hourAngle = 360 / 12; //保存之前画布 canvas.save(); //移动坐标 canvas.translate(radius, radius); Paint linePaint = new Paint(); linePaint.setColor(Color.BLACK); linePaint.setAntiAlias(true); linePaint.setStrokeWidth(4); //绘制小时的刻度线 for (int i = 0; i < hourCount; i++) { canvas.drawLine(0, radius, 0, radius - 40, linePaint); canvas.rotate(hourAngle); } //绘制分钟的刻度线 for (int j = 0; j < hourCount * 5; j++) { canvas.drawLine(0, radius, 0, radius - 20, linePaint); canvas.rotate(hourAngle / 5); } //获取当前的时间绘制时分秒指针的位置 Date date = new Date(); int hours = date.getHours(); int minutes = date.getMinutes(); int seconds = date.getSeconds(); float xzHourAngle = hours * 30 + 180; //(hours - 6) * 30 小时旋转的角度 float xzMinuteAngle = minutes * 6 + 180 - (hours - 6) * 30; //(minutes - 30) * 6分钟旋转的角度 float xzSecondAngle = seconds * 6 + 180 - (minutes - 30) * 6; //绘制小时指针 canvas.rotate(xzHourAngle); canvas.drawLine(0, 0, 0, radius - 120, linePaint); //绘制分钟指针 canvas.rotate(xzMinuteAngle); canvas.drawLine(0, 0, 0, radius - 90, linePaint); //绘制秒指针 canvas.rotate(xzSecondAngle); canvas.drawLine(0, 0, 0, radius - 60, linePaint); canvas.restore(); mHandler.sendEmptyMessageDelayed(1, 1000); } Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { postInvalidate(); } }; @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mHandler != null) { mHandler.removeCallbacksAndMessages(null); mHandler = null; } } /** * 根据手机的分辨率从dp的单位转换为px像素 * * @param context * @param dpValue * @return */ private int dip2px(Context context, float dpValue) { float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }}
<declare-styleable name="MyClock"> <attr name="author_size" format="dimension"/> <attr name="author_color" format="color"/> <attr name="author" format="string"/> </declare-styleable>
activity.xml
<barry.defineview.MyClock android:id="@+id/myview" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_centerInParent="true" barry:author="BarryYang" barry:author_color="#f00" barry:author_size="14sp" />
还是存在一些问题,先记录下。
阅读全文
0 0
- 自定义View手表 时分秒
- 自定义View 手表表盘
- 自定义时间组件:输入时分秒信息
- Flex4 自定义DateField 带时分秒
- 自定义View,绘制自己的手表Demo
- 时分秒
- 秒转时分秒
- 秒转为时分秒
- Flex4 DateField自定义的日期选择控件,可选择时分秒
- Flex4 DateField自定义的日期选择控件,可选择时分秒
- Flex4 DateField自定义的日期选择控件,可选择时分秒
- android自定义显示年月日,显示年月日时分秒
- Android自定义View:另一种实现手表指针转动的方法
- 时分秒转秒,秒转时分秒
- sql时分秒转为秒
- 秒转时分秒 js
- 年月日星期时分秒
- JS倒计时(时分秒)
- postgresql日期格式转换
- TortoiseSVN:请求的名称有效,但是找不到请求的类型的数据
- 关于前端开发中的“收口”思想
- java种的设计模式和原则
- 链接
- 自定义View手表 时分秒
- activiti 根据model部署流程 java.lang.NoClassDefFoundError: math/geom2d/line/LinearShape2D
- html发展历史
- 对人行的电票业务的一点理解
- 阿里云上安装编译vnpy1.7版本
- 2017-3-11 Kafka的应用场景
- 求图形周长,注意充分利用赋值的好处,省去了标记的麻烦
- 2016-11-3 IDEA调试hadoop的错误
- GridView控件实现分页