2024年最新android ViewPager 图片浏览和保存图片(1),kotlin面试题

学习宝典

对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对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架构的见解

附相关架构及资料

image.png

往期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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值