zoukankan      html  css  js  c++  java
  • 安卓学习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

  • 相关阅读:
    可爱的中国电信 请问我们的电脑还属于我们自己吗?
    了解客户的需求,写出的代码或许才是最优秀的............
    DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
    用数组公式获取字符在字符串中最后出现的位置
    在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)
    格式化json返回的时间
    ExtJs中使用Ajax赋值给全局变量异常解决方案
    java compiler level does not match the version of the installed java project facet (转)
    收集的资料(六)ASP.NET编程中的十大技巧
    收集的资料共享出来(五)Asp.Net 权限解决办法
  • 原文地址:https://www.cnblogs.com/092e/p/14916855.html
Copyright © 2011-2022 走看看