先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_textview_chronometer);//加载布局文件
initView();
}
private void initView() {
btn_start = findViewById(R.id.btn_start);
btn_stop = findViewById(R.id.btn_stop);
btn_reset = findViewById(R.id.btn_reset);
chronometer = findViewById(R.id.chronometer);
btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
btn_reset.setOnClickListener(this);
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onChronometerTick(Chronometer chronometer) {
MLog.e(String.valueOf(chronometer.getBase()));
//当前时间-基准时间>20秒
if(SystemClock.elapsedRealtime()-chronometer.getBase()>20*1000)
{
chronometer.setCountDown(true);
}
}
});
btn_format_1 = findViewById(R.id.btn_format_1);
ch_format = findViewById(R.id.ch_format);
btn_format_1.setOnClickListener(this);
ch_format.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
//当前时间-基准时间
long time = SystemClock.elapsedRealtime()-chronometer.getBase();
Date d = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm:ss”, Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone(“UTC”));
//设置为HH:mm:ss格式
ch_format.setText(sdf.format(d));
}
});
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_start:
//SystemClock.elapsedRealtime(),自启动以来经过的毫秒数。
//设置基准时间
chronometer.setBase(SystemClock.elapsedRealtime());
//true,倒计时
chronometer.setCountDown(false);
chronometer.setFormat(“计时: %s 秒”);
//开始计时
chronometer.start();
break;
case R.id.btn_stop:
//结束计时
chronometer.stop();
//文字显示
ch_format.setText(“00:00”);
break;
case R.id.btn_reset:
//重置基准时间
chronometer.setBase(SystemClock.elapsedRealtime());
break;
case R.id.btn_format_1:
ch_format.setBase(SystemClock.elapsedRealtime());
ch_format.setCountDown(false);
ch_format.start();
break;
}
}
}
Format格式修改
将Format默认的显示格式是00:00(MM:SS),修改为00:00:00(H:MM:SS)的显示格式。
只要Chronometer发生变化,**「onChronometerTick」**都会被触发,所以我们可以在触发后进行处理。得到我们想要显示样式。
ch_format.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
//当前时间-基准时间
long time = SystemClock.elapsedRealtime()-chronometer.getBase();
Date d = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm:ss”, Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone(“UTC”));
//设置为HH:mm:ss格式
ch_format.setText(sdf.format(d));
}
});
源码分析
setBase()
public void setBase(long base) {
//设置基准时间
mBase = base;
//触发监听事件
dispatchChronometerTick();
//修改当前界面
updateText(SystemClock.elapsedRealtime());
}
dispatchChronometerTick()
//触发监听事件
void dispatchChronometerTick() {
if (mOnChronometerTickListener != null) {
mOnChronometerTickListener.onChronometerTick(this);
}
}
updateText()
「修改当前界面」,首先拿**「当前时间和mBase时间作比较」,second是两种之间的「差值」**。DateUtils把second格式化,一般是"MM:SS"或"H:MM:SS",输出text。
如果定义了format格式,利用Formatter将text进一步格式化。
//修改
private synchronized void updateText(long now) {
mNow = now;
long seconds = mCountDown ? mBase - now : now - mBase;
seconds /= 1000;
boolean negative = false;
if (seconds < 0) {
seconds = -seconds;
negative = true;
}
String text = DateUtils.formatElapsedTime(mRecycle, seconds);
if (negative) {
text = getResources().getString(R.string.negative_duration, text);
}
if (mFormat != null) {
Locale loc = Locale.getDefault();
if (mFormatter == null || !loc.equals(mFormatterLocale)) {
mFormatterLocale = loc;
mFormatter = new Formatter(mFormatBuilder, loc);
}
mFormatBuilder.setLength(0);
mFormatterArgs[0] = text;
try {
mFormatter.format(mFormat, mFormatterArgs);
text = mFormatBuilder.toString();
} catch (IllegalFormatException ex) {
if (!mLogged) {
Log.w(TAG, "Illegal format string: " + mFormat);
mLogged = true;
}
}
}
setText(text);
}
start()
public void start() {
mStarted = true;
updateRunning();
}
stop()
public void stop() {
mStarted = false;
updateRunning();
}
updateRunning()
「start()」 和**「stop()」** 方法修改了**「mStarted」的状态,然后调用「updateRunning()」。 Chronometer状态由三部分组成,「mVisible」(Window是否可见)、「mStarted」(Chronometer开始计时)和「isShown」**(View是否可见)。
如果状态变化,修改当前控件。
最后
说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
外链图片转存中…(img-xDwehPI1-1713687265467)]
[外链图片转存中…(img-5hpr001G-1713687265468)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-180i1ITe-1713687265468)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!