学习宝典
对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
saveTv.setOnClickListener(this);
centerIv = (ImageView) findViewById(R.id.centerIv);
crossIv = (ImageView) findViewById(R.id.crossIv);
crossIv.setOnClickListener(this);
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setPageMargin((int) (getResources().getDisplayMetrics().density * 15));
mPager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return imageUrls.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
if (imageUrls[position] != null && !“”.equals(imageUrls[position])) {
final PhotoView view = new PhotoView(PhotoBrowserActivity.this);
view.enable();
view.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(PhotoBrowserActivity.this).load(imageUrls[position]).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).fitCenter().crossFade().listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
if (position == curPosition) {
hideLoadingAnimation();
}
showErrorLoading();
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
occupyOnePosition(position);
if (position == curPosition) {
hideLoadingAnimation();
}
return false;
}
}).into(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
view.setTag(position);
container.addView(view);
return view;
}
return null;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
releaseOnePosition(position);
container.removeView((View) object);
}
});
curPosition = returnClickedPosition() == -1 ? 0 : returnClickedPosition();
mPager.setCurrentItem(curPosition);
// mPager.setTag(curPosition);
if (initialedPositions[curPosition] != curPosition) {//如果当前页面未加载完毕,则显示加载动画,反之相反;
showLoadingAnimation();
}
photoOrderTv.setText((curPosition + 1) + “/” + imageUrls.length);//设置页面的编号
mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (initialedPositions[position] != position) {//如果当前页面未加载完毕,则显示加载动画,反之相反;
showLoadingAnimation();
} else {
hideLoadingAnimation();
}
curPosition = position;
curImageUrl = imageUrls[position];
photoOrderTv.setText((position + 1) + “/” + imageUrls.length);//设置页面的编号
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private int returnClickedPosition() {
if (imageUrls == null || curImageUrl == null) {
return -1;
}
for (int i = 0; i < imageUrls.length; i++) {
if (getOriginalUrl(curImageUrl).equals(imageUrls[i])) {
return i;
}
}
return -1;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.crossIv:
finish();
break;
case R.id.saveTv:
// savePhotoToLocal();
saveOriginalPhotoToLocal(getOriginalUrl(curImageUrl));
break;
case R.id.downloadOriginal:
saveOriginalPhotoToLocal(getOriginalUrl(curImageUrl));
break;
default:
break;
}
}
private void showLoadingAnimation() {
centerIv.setVisibility(View.VISIBLE);
centerIv.setImageResource(R.drawable.loading);
if (objectAnimator == null) {
objectAnimator = ObjectAnimator.ofFloat(centerIv, “rotation”, 0f, 360f);
objectAnimator.setDuration(2000);
objectAnimator.setRepeatCount(ValueAnimator.INFINITE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
objectAnimator.setAutoCancel(true);
}
}
objectAnimator.start();
}
private void hideLoadingAnimation() {
releaseResource();
centerIv.setVisibility(View.GONE);
}
private void showErrorLoading() {
releaseResource();
centerIv.setRotation(0f);
centerIv.setVisibility(View.GONE);
centerIv.setImageResource(R.drawable.list_img);
}
private void releaseResource() {
if (objectAnimator != null) {
objectAnimator.cancel();
}
if (centerIv.getAnimation() != null) {
centerIv.getAnimation().cancel();
}
}
private void occupyOnePosition(int position) {
initialedPositions[position] = position;
}
private void releaseOnePosition(int position) {
initialedPositions[position] = -1;
}
private void initInitialedPositions() {
for (int i = 0; i < initialedPositions.length; i++) {
initialedPositions[i] = -1;
}
}
private String getOriginalUrl(String url) {
//http://images.yxtribe.com/upload/images/ep123456/20171101184127659.jpg-style_webp_375x225
return url.contains(“yxtribe”) ? url.split(“-style”)[0] : url;
}
private void saveOriginalPhotoToLocal(final String url) {
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = null;
try {
// file = Glide.with(context)
// .load(url)
// .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
// .get();
bitmap = Glide.with(PhotoBrowserActivity.this)
.load(url)
.asBitmap()
.into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.get();
if (bitmap != null){
// 在这里执行图片保存方法
Utils.savePhoto(PhotoBrowserActivity.this, bitmap, new Utils.SaveResultCallback() {
@Override
public void onSavedSuccess() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(PhotoBrowserActivity.this, “已保存至相册”, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onSavedFailed() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(PhotoBrowserActivity.this, “保存失败”, Toast.LENGTH_SHORT).show();
}
});
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void savePhotoToLocal() {
try {
// ViewGroup containerTemp = (ViewGroup) mPager.findViewWithTag(mPager.getCurrentItem());
// if (containerTemp == null) {
// return;
// }
// PhotoView photoViewTemp = (PhotoView) mPager.getChildAt(curPosition);
// ViewGroup containerTemp = (ViewGroup) mPager.findViewWithTag(mPager.getCurrentItem());
// if (containerTemp == null) {
// return;
// }
PhotoView photoViewTemp = (PhotoView) mPager.findViewWithTag(mPager.getCurrentItem());
if (photoViewTemp != null) {
GlideBitmapDrawable glideBitmapDrawable = (GlideBitmapDrawable) photoViewTemp.getDrawable();
if (glideBitmapDrawable == null) {
return;
}
Bitmap bitmap = glideBitmapDrawable.getBitmap();
if (bitmap == null) {
return;
}
Utils.savePhoto(this, bitmap, new Utils.SaveResultCallback() {
@Override
public void onSavedSuccess() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(PhotoBrowserActivity.this, “已保存至相册”, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onSavedFailed() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(PhotoBrowserActivity.this, “保存失败”, Toast.LENGTH_SHORT).show();
}
});
}
});
}
} catch (Exception e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(PhotoBrowserActivity.this, “保存失败”, Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
protected void onDestroy() {
releaseResource();
if (mPager != null) {
mPager.removeAllViews();
mPager = null;
}
super.onDestroy();
最后
在此为大家准备了四节优质的Android高级进阶视频:
架构师项目实战——全球首批Android开发者对Android架构的见解
附相关架构及资料
往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
eResource();
if (mPager != null) {
mPager.removeAllViews();
mPager = null;
}
super.onDestroy();
最后
在此为大家准备了四节优质的Android高级进阶视频:
架构师项目实战——全球首批Android开发者对Android架构的见解
附相关架构及资料
[外链图片转存中…(img-SnKyrN48-1715133921412)]
往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!