2024年Android最全Android---仿QQ空间动态九宫格图片预览(一),2024年最新阿里巴巴的面试题

最后我还整理了很多Android中高级的PDF技术文档。以及一些大厂面试真题解析文档。

image

Android高级架构师之路很漫长,一起共勉吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

implementation ‘com.github.bumptech.glide:glide:4.12.0’

annotationProcessor ‘com.github.bumptech.glide:compiler:4.12.0’

image

  1. AndroidManifest.xml添加权限

android:requestLegacyExternalStorage=“true”

android:usesCleartextTraffic=“true”

image

  1. 在布局文件中添加 NineGridImageView, 如下所示:

<com.jaeger.ninegridimageview.NineGridImageView

xmlns:app=“http://schemas.android.com/apk/res-auto”

android:layout_height=“wrap_content”

android:layout_margin=“16dp”

android:layout_width=“match_parent”

app:imgGap=“4dp”

app:showStyle=“fill”

app:singleImgSize=“120dp”/>

  1. 为 NineGridImageView 设置 NineGridImageViewAdapter

nineGridImageView.setAdapter(nineGridViewAdapter);

下面是 NineGridImageViewAdapter.class 的源码:

public abstract class NineGridImageViewAdapter {

protected abstract void onDisplayImage(Context context, ImageView imageView, T t);

protected void onItemImageClick(Context context, int index, List list) {

}

protected ImageView generateImageView(Context context) {

GridImageView imageView = new GridImageView(context);

imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

return imageView;

}

}

  • T 是你图片的数据类型, 你可以简单的使用 String 类型也可以是你自定义的类型;

  • 你必须重写 onDisplayImage(Context context, ImageView imageView, T t) 方法去设置显示图片的方式, 你可以使用 Picasso、Glide 、ImageLoader 或者其他的图片加载库,你也可以给 ImageView 设置一个占位图;

  • 如果你需要处理图片的点击事件,你可以重写 onItemImageClick(Context context, int index, List<T> list) 方法,加上你自己的处理逻辑;

  • 如果你要使用自定义的 ImageView,你可以重写 generateImageView(Context context) 方法, 去生成自定的 ImageView

下面是一段示例代码:

private NineGridImageViewAdapter mAdapter = new NineGridImageViewAdapter() {

@Override

protected void onDisplayImage(Context context, ImageView imageView, Photo photo) {

Picasso.with(context)

.load(photo.getSmallUrl)

.placeholder(R.drawable.ic_default_image)

.into(imageView);

}

@Override

protected ImageView generateImageView(Context context) {

return super.generateImageView(context);

}

@Override

protected void onItemImageClick(Context context, int index, List photoList) {

showBigPicture(context, photoList.get(index).getBigUrl());

}

mNineGridImageView.setAdapter(mAdapter);

  1. 给 NineGridImageView 设置图片数据:

nineGridImageView.setImagesData(List imageDataList);

demo代码

MainActivity

package com.huncm.review1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;

import android.os.Bundle;

import android.widget.ImageView;

import android.widget.Toast;

import com.bumptech.glide.Glide;

import com.jaeger.library.StatusBarUtil;

import com.jaeger.ninegridimageview.NineGridImageView;

import com.jaeger.ninegridimageview.NineGridImageViewAdapter;

import java.util.ArrayList;

import java.util.List;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

List list = new ArrayList<>();

list.add(“https://cdn.jsdelivr.net/gh/Yqifei/Blog-Image@master/20211026/image.6719h9mvs700.png”);

list.add(“https://img-blog.csdnimg.cn/img_convert/8dc4978a27ba3ccdaa697c2d7814f3ac.png”);

list.add(“https://img-blog.csdnimg.cn/img_convert/52f5dd5a02ab958c9a2b4daa825925e5.png”);

list.add(“https://cdn.jsdelivr.net/gh/Yqifei/Blog-Image@master/20211026/image.6719h9mvs700.png”);

list.add(“https://img-blog.csdnimg.cn/img_convert/8dc4978a27ba3ccdaa697c2d7814f3ac.png”);

NineGridImageView nineGridImageView = findViewById(R.id.nineGridImageView);

nineGridImageView.setAdapter(myadpter);

nineGridImageView.setImagesData( list);

}

private NineGridImageViewAdapter myadpter = new NineGridImageViewAdapter() {

@Override

protected void onDisplayImage(Context context, ImageView imageView, String url) {

Glide.with(context).load(url).into(imageView);

}

@Override

protected void onItemImageClick(Context context, int index, List list) {

super.onItemImageClick(context, index, list);

}

@Override

protected ImageView generateImageView(Context context) {

return super.generateImageView(context);

}

};

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<com.jaeger.ninegridimageview.NineGridImageView

android:id=“@+id/nineGridImageView”

android:layout_width=“0dp”

android:layout_height=“wrap_content”

android:layout_margin=“16dp”

android:layout_marginStart=“16dp”

android:layout_marginLeft=“16dp”

android:layout_marginEnd=“16dp”

android:layout_marginRight=“16dp”

app:imgGap=“4dp”

app:maxSize=“9”

app:showStyle=“grid”

app:layout_constraintEnd_toEndOf=“parent”

app:layout_constraintStart_toStartOf=“parent”

app:layout_constraintTop_toTopOf=“parent” />

</androidx.constraintlayout.widget.ConstraintLayout>

当我实现这个控件的时候,我发现他不能点击图片放大,图片不能预览,而且不能左滑右滑😢,我的卑微又开始了,我就去网上找了如何实现点击方大

这时出现了第二个控件:PhotoView

PhotoView控件


简单的介绍

这是一个图片查看库,实现图片浏览功能,支持pinch(捏合)手势或者点击放大缩小。支持在ViewPager中翻页浏览图片。

PhotoView 是一款扩展自Android ImageView ,支持通过单点/多点触摸来进行图片缩放的智能控件。功能实用和强大。

特性

可以用于查看图片,并对图片进行拖动缩放,拖动过程中不会出现边缘空白;

双击缩小放大,Fling移动,并支持上述过程的渐变;

在放大情况下也支持viewpager等的拖动切换;

支持多击事件检测,单机,双击事件;

支持各种回调给调用者;

效果预览

image

使用

  1. 在根文件(不是模块文件)中添加此:build.gradle

allprojects {

repositories {

maven { url “https://www.jitpack.io” }

}

}

buildscript {

repositories {

maven { url “https://www.jitpack.io” }

}

}

  1. 导入依赖

implementation ‘com.github.chrisbanes:PhotoView:2.0.0’

  1. 编写布局文件
<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity2”>

<com.github.chrisbanes.photoview.PhotoView

android:id=“@+id/photo_view”

android:layout_width=“0dp”

android:layout_height=“0dp”

app:layout_constraintBottom_toBottomOf=“parent”

app:layout_constraintEnd_toEndOf=“parent”

app:layout_constraintStart_toStartOf=“parent”

app:layout_constraintTop_toTopOf=“parent”

tools:ignore=“MissingClass” />

</androidx.constraintlayout.widget.ConstraintLayout>

  1. 编写逻辑代码

package com.huncm.review1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.bumptech.glide.Glide;

import com.github.chrisbanes.photoview.PhotoView;

import javax.microedition.khronos.opengles.GL;

public class MainActivity2 extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main2);

PhotoView photoView = findViewById(R.id.photo_view);

Glide.with(this).load(“https://img-blog.csdnimg.cn/img_convert/52f5dd5a02ab958c9a2b4daa825925e5.png”).into(photoView);

}

}

写到这里QQ九宫格也算是实现了一半,如果只是这两个控件的话,实现的QQ九宫格图片不能预览,也不能左滑右滑,我便在网上搜索了一波。找到一种解决方法:使用ViewPager和PhotoView实现图片浏览

使用ViewPager和PhotoView实现图片浏览


使用photoView实现图片的放大缩小,再使用viewPager实现图片的左右滑动

image

添加依赖

  • build.gradle (app)

//photoView

implementation ‘com.github.chrisbanes:PhotoView:2.0.0’

//glide

implementation ‘com.github.bumptech.glide:glide:4.9.0’

annotationProcessor ‘androidx.annotation:annotation:1.0.0’

annotationProcessor ‘com.github.bumptech.glide:compiler:4.9.0’

  • build.gradle (project)

allprojects {

repositories {

google()

jcenter()

maven { url “https://jitpack.io” }

}

}

  • manifests 添加网络权限

XML文件

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<androidx.viewpager.widget.ViewPager

android:id=“@+id/viewpager”

android:layout_width=“0dp”

android:layout_height=“0dp”

android:background=“#99000000”

app:layout_constraintBottom_toBottomOf=“parent”

app:layout_constraintEnd_toEndOf=“parent”

app:layout_constraintStart_toStartOf=“parent”

app:layout_constraintTop_toTopOf=“parent”></androidx.viewpager.widget.ViewPager>

<LinearLayout

android:id=“@+id/points”

android:layout_width=“0dp”

android:layout_height=“wrap_content”

android:layout_alignBottom=“@+id/viewpager”

android:gravity=“center”

android:orientation=“horizontal”

android:padding=“5dp”

app:layout_constraintEnd_toEndOf=“parent”

app:layout_constraintStart_toStartOf=“parent”

app:layout_constraintTop_toTopOf=“@+id/viewpager”>

</androidx.constraintlayout.widget.ConstraintLayout>

使用Glide

这里使用Glide来加载网络图片,Gilde自从4.0.0版本开始要通过生成GlideApp类来使用各种Api,那么就开始动手实践吧

  1. 生成GlideApp
  • 首先创建MyAppGlideModule类

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • BAT大厂面试题、独家面试工具包,

  • 资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

/LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

使用Glide

这里使用Glide来加载网络图片,Gilde自从4.0.0版本开始要通过生成GlideApp类来使用各种Api,那么就开始动手实践吧

  1. 生成GlideApp
  • 首先创建MyAppGlideModule类

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • BAT大厂面试题、独家面试工具包,

  • 资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,

    [外链图片转存中…(img-WAGuAODx-1715705919658)]
    [外链图片转存中…(img-D97nIaod-1715705919658)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到Android面试时,高级级别的问通常会涉及更深入的主和技术。以下是一些可能的高级Android面试及其答案: 1. 请解释一下Android中的四大组件。 答:Android中的四大组件是Activity、Service、BroadcastReceiver和ContentProvider。Activity用于用户界面的展示和交互,Service用于在后台执行长时间运行的任务,BroadcastReceiver用于接收和处理系统广播消息,ContentProvider用于数据共享和访问。 2. 请解释一下Android中的MVC、MVP和MVVM架构模式。 答:MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为模型(数据)、视图(用户界面)和控制器(逻辑处理)三个部分。MVP(Model-View-Presenter)是MVC的变体,将控制器替换为Presenter,使视图和模型之间的耦合更低。MVVM(Model-View-ViewModel)是一种新的架构模式,通过数据绑定实现视图和模型之间的通信。 3. 请解释一下Android中的内存泄漏以及如何避免。 答:内存泄漏是指应用程序中未使用的内存无法被垃圾回收器回收,导致内存占用不断增加。在Android中,常见的内存泄漏原因包括静态引用、匿名内部类、Handler引起的内存泄漏等。避免内存泄漏的方法包括及时释放资源、避免使用静态引用、避免匿名内部类等。 4. 请解释一下Android中的线程和线程间通信方式。 答:在Android中,可以使用Thread类或者HandlerThread类创建线程。线程间通信的方式包括使用Handler进行消息传递、使用AsyncTask进行异步任务处理、使用BroadcastReceiver进行广播消息传递等。 5. 请解释一下Android中的性能优化技巧。 答:Android性能优化的技巧包括减少内存使用、优化布局和绘制、使用合适的数据结构和算法、避免频繁的IO操作、使用缓存等。此外,还可以使用工具如Lint、TraceView和HierarchyViewer进行性能分析和调优。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值