志在指尖
用双手敲打未来

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

针对Android底层View的直接结构很多网友没有实战经历,本次Android开发网分离目前平台开源代码一同经过
AnalogClock类来了解View的直接继承。AnalogClock就是HomeScreen上的那个带有两根指针的表盘类。它的完成我们直接从开源代码能够理解到:Android
publicclassAnalogClockextendsView{
privateTimemCalendar;
privateDrawablemHourHand;//时针
privateDrawablemMinuteHand;//分针
privateDrawablemDial;//表盘背景
privateintmDialWidth;//表盘宽度
privateintmDialHeight;//表盘高度
privatebooleanmAttached;//附着状态
privatefinalHandlermHandler=newHandler();//定一个Handler类完成更新时间
privatefloatmMinutes;
privatefloatmHour;
privatebooleanmChanged;//时间能否改动
publicAnalogClock(Contextcontext){
this(context,null);
}
publicAnalogClock(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicAnalogClock(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
Resourcesr=mContext.getResources();
TypedArraya=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=newTime();//获取当前系统时间
mDialWidth=mDial.getIntrinsicWidth();//获取表盘图片的宽度
mDialHeight=mDial.getIntrinsicHeight();//高度,同上
}
@Override
protectedvoidonAttachedToWindow(){
super.onAttachedToWindow();
if(!mAttached){
mAttached=true;
IntentFilterfilter=newIntentFilter();//注册一个音讯过滤器,获取时间改动时区,改动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=newTime();
onTimeChanged();
}
@Override
protectedvoidonDetachedFromWindow(){
super.onDetachedFromWindow();
if(mAttached){
getContext().unregisterReceiver(mIntentReceiver);//反注册音讯过滤器
mAttached=false;
}
}@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
intwidthMode=MeasureSpec.getMode(widthMeasureSpec);
intwidthSize=MeasureSpec.getSize(widthMeasureSpec);
intheightMode=MeasureSpec.getMode(heightMeasureSpec);
intheightSize=MeasureSpec.getSize(heightMeasureSpec);
floathScale=1.0f;
floatvScale=1.0f;
if(widthMode!=MeasureSpec.UNSPECIFIED&&widthSize<mDialWidth){
hScale=(float)widthSize/(float)mDialWidth;
}
if(heightMode!=MeasureSpec.UNSPECIFIED&&heightSize<mDialHeight){
vScale=(float)heightSize/(float)mDialHeight;
}
floatscale=Math.min(hScale,vScale);
setMeasuredDimension(resolveSize((int)(mDialWidth*scale),widthMeasureSpec),
resolveSize((int)(mDialHeight*scale),heightMeasureSpec));
}
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){
super.onSizeChanged(w,h,oldw,oldh);
mChanged=true;
}//主要的绘图重写View的onDraw办法,我们能够看到经过canvas实例直接屏幕
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
booleanchanged=mChanged;
if(changed){
mChanged=false;
}
intavailableWidth=mRight-mLeft;
intavailableHeight=mBottom-mTop;
intx=availableWidth/2;

未经允许不得转载:IT技术网站 » Android 自定义 View 实例实例 AnalogClock 源码源码
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载