Android源码之DeskClock (四)

一.概述

之前写三的时候饶了个弯,通过DeskClock这个项目简单实现了一下加固+热修复,在这篇继续回到正规继续分析源码.在二里面大致分析了DeskClock的主入口,跟四个主要功能Fragment的转换,从这篇开始就着手分析这四大功能.先从Clock功能的Fragment开始讲起.

二.源码分析

1.onCreateView

这里根据ClockFragment生命周期的顺序分析,首先是onCreateView,这里做的工作就是装载布局文件,初始化控件适配器和声明监听.

这里布局分横屏和竖屏两种,整体的结构是以listview为主,挂载header,footer,menu和选择城市构成.所以除了通用的控件,在初始化控件的时候需要区分横屏竖屏.这里时钟的布局在横屏的时候是跟listview分开的,而在竖屏的时候是作为listview的headerview存在的,所以源码中就先去获取横屏中的clock的view,如果为空说明当前是竖屏的布局直接inflate出来挂到listview的headerview上.

[java]view plain

//Ontabletlandscape,theclockframewillbeadistinctview.Otherwise,it’llbeadded//onasaheadertothemainlistview.mClockFrame=v.findViewById(R.id.main_clock_left_pane);mClockFrame=inflater.inflate(R.layout.main_clock_frame,mList,false);}else{//Themainclockframeneedsitsowntouchlistenerfornightmodenow.v.setOnTouchListener(longPressNightMode);}mList.setOnTouchListener(longPressNightMode);

从上面的源码看到横屏的时候在Clock的view上和竖屏的时候listview上都设置了同一个TouchListener,从监听的名字能感觉到是长按之后进入夜间模式的作用.为什么Android提供了长按的监听(setOnLongClickListener),为什么还要骚骚得自己写长按的监听,当然自己写长按监听可以定制更加细节的规则,例如长按的时间,长按时滑动的容错处理等.在初始化的时候通过ViewConfiguration中的配置进行填充容错偏移和长按触发的时间值,当监听到用户按下屏幕后通过handler post一个进入夜间模式页面的延迟消息到message queue并记录当前Down的坐标,之后如果用户滑动的话就根据记录的touch坐标计算滑动的偏移量,当偏移量大于容错时就把之前的消息从message queue中移除掉.如果用户长按的时候没有达到设定并离开屏幕的话也会执行default中的移除消息.

[java]view plain

@OverridemMaxMovementAllowed=ViewConfiguration.get(getActivity()).getScaledTouchSlop();mLongPressTimeout=ViewConfiguration.getLongPressTimeout();}switch(event.getAction()){case(MotionEvent.ACTION_DOWN):longtime=Utils.getTimeNow();mHandler.postDelayed(newRunnable(){@Override}},mLongPressTimeout);mLastTouchX=event.getX();mLastTouchY=event.getY();case(MotionEvent.ACTION_MOVE):floatxDiff=Math.abs(event.getX()-mLastTouchX);floatyDiff=Math.abs(event.getY()-mLastTouchY);if(xDiff>=mMaxMovementAllowed||yDiff>=mMaxMovementAllowed){mHandler.removeCallbacksAndMessages(null);}break;default:mHandler.removeCallbacksAndMessages(null);}}};

2.onResume

我是在旅行吗?也许是的。

Android源码之DeskClock (四)

相关文章:

你感兴趣的文章:

标签云: