最后我还整理了很多Android中高级的PDF技术文档。以及一些大厂面试真题解析文档。
Android高级架构师之路很漫长,一起共勉吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
implementation ‘com.github.bumptech.glide:glide:4.12.0’
annotationProcessor ‘com.github.bumptech.glide:compiler:4.12.0’
AndroidManifest.xml
添加权限
android:requestLegacyExternalStorage=“true”
android:usesCleartextTraffic=“true”
- 在布局文件中添加 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”/>
- 为 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);
…
- 给 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
<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
简单的介绍
这是一个图片查看库,实现图片浏览功能,支持pinch(捏合)手势或者点击放大缩小。支持在ViewPager中翻页浏览图片。
PhotoView 是一款扩展自Android ImageView ,支持通过单点/多点触摸来进行图片缩放的智能控件。功能实用和强大。
特性
可以用于查看图片,并对图片进行拖动缩放,拖动过程中不会出现边缘空白;
双击缩小放大,Fling移动,并支持上述过程的渐变;
在放大情况下也支持viewpager等的拖动切换;
支持多击事件检测,单机,双击事件;
支持各种回调给调用者;
效果预览
使用
- 在根文件(不是模块文件)中添加此:
build.gradle
allprojects {
repositories {
maven { url “https://www.jitpack.io” }
}
}
buildscript {
repositories {
maven { url “https://www.jitpack.io” }
}
}
- 导入依赖
implementation ‘com.github.chrisbanes:PhotoView:2.0.0’
- 编写布局文件
<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>
- 编写逻辑代码
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实现图片浏览
使用photoView实现图片的放大缩小,再使用viewPager实现图片的左右滑动
添加依赖
- 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
<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,那么就开始动手实践吧
- 生成GlideApp
- 首先创建MyAppGlideModule类
总结:
各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。
-
BAT大厂面试题、独家面试工具包,
-
资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
/LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
使用Glide
这里使用Glide来加载网络图片,Gilde自从4.0.0版本开始要通过生成GlideApp类来使用各种Api,那么就开始动手实践吧
- 生成GlideApp
- 首先创建MyAppGlideModule类
总结:
各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。
-
BAT大厂面试题、独家面试工具包,
-
资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,
[外链图片转存中…(img-WAGuAODx-1715705919658)]
[外链图片转存中…(img-D97nIaod-1715705919658)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!