• 安卓学习70


    Android 自定义View 实例实例AnalogClock 源码源码

    针对Android 底层View 的直接构造很多网友没有实战经验,本次Android 开发网结合目前平台开源代码一起通过

    AnalogClock 类来理解View 的直接继承。AnalogClock 就是Home Screen 上的那个带有两根指针的表盘类。它的实现我们直

    接从开源代码可以了解到:

    public class AnalogClock extends View {

    private Time mCalendar;

    private Drawable mHourHand; //时针

    private Drawable mMinuteHand; //分针

    private Drawable mDial; //表盘背景

    private int mDialWidth; //表盘宽度

    private int mDialHeight; //表盘高度

    private boolean mAttached; //附着状态

    private final Handler mHandler = new Handler(); //定一个Handler 类实现更新时间

    private float mMinutes;

    private float mHour;

    private boolean mChanged; //时间是否改变

    public AnalogClock(Context context) {

    this(context, null);

    }

    public AnalogClock(Context context, AttributeSet attrs) {

    this(context, attrs, 0);

    }

    public AnalogClock(Context context, AttributeSet attrs, int defStyle) {

    super(context, attrs, defStyle);

    Resources r = mContext.getResources();

    TypedArray a = context.obtainStyledAttributes(

    attrs, com.android.internal.R.styleable.AnalogClock, defStyle, 0);

    mDial = a.getDrawable(com.android.internal.R.styleable.AnalogClock_dial); //加载表盘资源

    if (mDial == null) {

    mDial = r.getDrawable(com.android.internal.R.drawable.clock_dial);

    }

    mHourHand = a.getDrawable(com.android.internal.R.styleable.AnalogClock_hand_hour); //加载时针图片资

    if (mHourHand == null) {

    mHourHand = r.getDrawable(com.android.internal.R.drawable.clock_hand_hour);

    }

    mMinuteHand = a.getDrawable(com.android.internal.R. styleable.AnalogClock_hand_minute); //加载分针图

    if (mMinuteHand == null) {

    mMinuteHand = r.getDrawable(com.android.internal.R.drawable.clock_hand_minute);

    } mCalendar = new Time(); //获取当前系统时间

    mDialWidth = mDial.getIntrinsicWidth(); //获取表盘图片的宽度

    mDialHeight = mDial.getIntrinsicHeight(); //高度,同上

    }

    @Override

    protected void onAttachedToWindow() {

    super.onAttachedToWindow();

    if (!mAttached) {

    mAttached = true;

    IntentFilter filter = new IntentFilter();//注册一个消息过滤器,获取时间改变时区,改变action filter.addAction(Intent.ACTION_TIME_TICK);

    filter.addAction(Intent.ACTION_TIME_CHANGED) ;

    filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);

    getContext().registerReceiver(mIntentReceiver, filter, null, mHandler);

    }

    mCalendar = new Time();

    onTimeChanged();

    }

    @Override

    protected void onDetachedFromWindow() {

    super.onDetachedFromWindow();

    if (mAttached) {

    getContext().unregisterReceiver(mIntentReceiver); //反注册消息过滤器

    mAttached = false;

    }

    } @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int widthMode = MeasureSpec.getMode(widthMeasureSpec);

    int widthSize = MeasureSpec.getSize(widthMeasureSpec);

    int heightMode = MeasureSpec.getMode(heightMeasureSpec);

    int heightSize = MeasureSpec.getSize(heightMeasureSpec);

    float hScale = 1.0f;

    float vScale = 1.0f;

    if (widthMode != MeasureSpec.UNSPECIFIED && widthSize < mDialWidth) {

    hScale = (float) widthSize / (float) mDialWidth;

    }

    if (heightMode != MeasureSpec.UNSPECIFIED && heightSize < mDialHeight) {

    vScale = (float )heightSize / (float) mDialHeight;

    }

    float scale = Math.min(hScale, vScale);

    setMeasuredDimension(resolveSize((int) (mDialWidth * scale), widthMeasureSpec), resolveSize((int) (mDialHeight * scale), heightMeasureSpec));

    }

    @Override

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {

    super.onSizeChanged(w, h, oldw, oldh);

    mChanged = true;

    } //主要的绘图重写View 的onDraw 方法,我们可以看到通过canvas 实例直接屏幕

    @Override

    protected void onDraw(Canvas canvas) {

    super.onDraw(canvas);

    boolean changed = mChanged;

    if (changed) {

    mChanged = false;

    }

    int availableWidth = mRight - mLeft; int availableHeight = mBottom - mTop; int x = availableWidth / 2

  • 相关阅读:
    size_t和size_type 的区别 什么时候用哪个?
    分享:在django中执行脚本
    Jquery真的不难~第一回 编程基础知识
    Jquery真的不难~第三回 如何改变HTML标签的样式
    Castle~实现IoC容器
    Jquery真的不难~第二回 选择器的使用及性能
    Castle~动态代理实现对方法的拦截
    jquery学习手记(8)遍历
    jquery学习手记(2)jQuery对象和DOM对象相互转换
    jquery学习手记(9)事件基础知识
  • 原文地址:https://www.cnblogs.com/092e/p/14916855.html
Copyright © 2020-2023  润新知