自定义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);    }}


attrs.xml

    <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" />

还是存在一些问题,先记录下。


原创粉丝点击