import androidx.appcompat.widget.AppCompatTextView;
/**
- 颜色波浪TextView
*/
public class LoadingTextView extends AppCompatTextView {
private LinearGradient mLinearGradient;
private Matrix mGradientMatrix;
private Paint mPaint;
private int mViewWidth = 0;
private int mTranslate = 0;
private boolean mAnimating = true;
public LoadingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mViewWidth == 0) {
mViewWidth = getMeasuredWidth();
if (mViewWidth > 0) {
mPaint = getPaint();
mLinearGradient = new LinearGradient(-mViewWidth, 0, 0, 0,
new int[]{0x33ffffff, 0xff3286ED, 0x33ffffff},
new float[]{0, 0.5f, 1}, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
mGradientMatrix = new Matrix();
}
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mAnimating && mGradientMatrix != null) {
mTranslate += mViewWidth / 10;
if (mTranslate > 2 * mViewWidth) {
mTranslate = -mViewWidth;
}
mGradientMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
postInvalidateDelayed(50);
}
}
}
LoadingView.java
package com.llw.mvplibrary.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.util.AttributeSet;
import androidx.annotation.Nullable;
import com.llw.mvplibrary.R;
import java.lang.ref.SoftReference;
/**
- 加载框
*/
public class LoadingView extends androidx.appcompat.widget.AppCompatImageView {
private int mCenterRotateX;//图片旋转点x
private int mCenterRotateY;//图片旋转点y
private LoadingRunnable mRunnable;
public LoadingView(Context context) {
this(context, null);
}
public LoadingView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public LoadingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
setScaleType(ScaleType.MATRIX);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.loading);
setImageBitmap(bitmap);
mCenterRotateX = bitmap.getWidth() / 2;
mCenterRotateY = bitmap.getHeight() / 2;
}
/**
- onDraw()之前调用
*/
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (mRunnable==null){
mRunnable=new LoadingRunnable(this);
}
if (!mRunnable.isLoading){
mRunnable.start();
}
}
/**
- view销毁时调用
*/
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mRunnable!=null){
mRunnable.stop();
}
mRunnable=null;
}
class LoadingRunnable implements Runnable {
private boolean isLoading;
private Matrix mMatrix;
private SoftReference mLoadingViewSoftReference;
private float mDegrees = 0f;
public LoadingRunnable(LoadingView loadingView) {
mLoadingViewSoftReference = new SoftReference(loadingView);
mMatrix = new Matrix();
}
@Override
public void run() {
if (mLoadingViewSoftReference.get().mRunnable != null && mMatrix != null) {
mDegrees += 30f;
mMatrix.setRotate(mDegrees, mCenterRotateX, mCenterRotateY);
mLoadingViewSoftReference.get().setImageMatrix(mMatrix);
if (mDegrees==360){
mDegrees=0f;
}
if (isLoading) {
mLoadingViewSoftReference.get().postDelayed(mLoadingViewSoftReference.get().mRunnable, 100);
}
}
}
public void stop() {
isLoading = false;
}
public void start() {
isLoading = true;
if (mLoadingViewSoftReference.get().mRunnable != null && mMatrix != null) {
mLoadingViewSoftReference.get().postDelayed(mLoadingViewSoftReference.get().mRunnable, 100);
}
}
}
}
在模块的res文件夹下创建一个新的layout文件夹用处存放布局文件,然后创建一个弹窗的布局文件dialog_loading.xml
代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:id=“@+id/layout_loading”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:background=“@drawable/ic_loading_bg”
android:gravity=“center”
android:orientation=“vertical”
android:padding=“16dp”>
<com.llw.mvplibrary.view.LoadingView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content” />
<com.llw.mvplibrary.view.LoadingTextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_marginTop=“8dp”
android:text=“加载中…”
android:textColor=“#fff”
android:textSize=“16sp” />
当然弹窗的出现和消失也是要给动画的。
在模块的styles.xml文件中增加。
接下来就是使用了,考虑到可能有多个地方要使用这个,所以将使用方法封装到底层的BaseActivity中,
private Dialog mDialog;//加载弹窗
//弹窗出现
public void showLoadingDialog(){
if (mDialog == null) {
mDialog = new Dialog(context, R.style.loading_dialog);
}
mDialog.setContentView(R.layout.dialog_loading);
mDialog.setCancelable(false);
mDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
mDialog.show();
}
//弹窗消失
public void dismissLoadingDialog(){
if (mDialog != null) {
mDialog.dismiss();
}
mDialog = null;
}
同理,在BaseFragment中也放入,使用过程中只要你的Activity继承了BaseActivity或者MvpActivity都可以调用弹窗的出现和消失方法。
接下来在MainActivity中使用。
接下来进行必应每日一图的接口访问。
访问地址:
https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
访问之后:
用这串地址返回的数据生成一个实体Bean。
在项目的bean包下创建一个BiYingImgResponse.java类
代码如下:
package com.llw.goodweather.bean;
import java.util.List;
public class BiYingImgResponse {
/**
-
images : [{“startdate”:“20200406”,“fullstartdate”:“202004061600”,“enddate”:“20200407”,“url”:“/th?id=OHR.PinkMoon_ZH-CN9026483067_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp”,“urlbase”:“/th?id=OHR.PinkMoon_ZH-CN9026483067”,“copyright”:“四月的满月从圣迈克尔山上升起,英国康沃尔 (© Simon Maycock/Alamy Live News)”,“copyrightlink”:“https://www.bing.com/search?q=%E5%9C%A3%E7%B1%B3%E6%AD%87%E5%B0%94%E5%B1%B1&form=hpcapt&mkt=zh-cn”,“title”:“”,“quiz”:“/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20200406_PinkMoon%22&FORM=HPQUIZ”,“wp”:true,“hsh”:“571d8c115ed49dad56d5f1e678ddeeb1”,“drk”:1,“top”:1,“bot”:1,“hs”:[]}]
-
tooltips : {“loading”:“正在加载…”,“previous”:“上一个图像”,“next”:“下一个图像”,“walle”:“此图片不能下载用作壁纸。”,“walls”:“下载今日美图。仅限用作桌面壁纸。”}
*/
private TooltipsBean tooltips;
private List images;
public TooltipsBean getTooltips() {
return tooltips;
}
public void setTooltips(TooltipsBean tooltips) {
this.tooltips = tooltips;
}
public List getImages() {
return images;
}
public void setImages(List images) {
this.images = images;
}
public static class TooltipsBean {
/**
-
loading : 正在加载…
-
previous : 上一个图像
-
next : 下一个图像
-
walle : 此图片不能下载用作壁纸。
-
walls : 下载今日美图。仅限用作桌面壁纸。
*/
private String loading;
private String previous;
private String next;
private String walle;
private String walls;
public String getLoading() {
return loading;
}
public void setLoading(String loading) {
this.loading = loading;
}
public String getPrevious() {
return previous;
}
public void setPrevious(String previous) {
this.previous = previous;
}
public String getNext() {
return next;
}
public void setNext(String next) {
this.next = next;
}
public String getWalle() {
return walle;
}
public void setWalle(String walle) {
this.walle = walle;
}
public String getWalls() {
return walls;
}
public void setWalls(String walls) {
this.walls = walls;
}
}
public static class ImagesBean {
/**
-
startdate : 20200406
-
fullstartdate : 202004061600
-
enddate : 20200407
-
url : /th?id=OHR.PinkMoon_ZH-CN9026483067_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
-
urlbase : /th?id=OHR.PinkMoon_ZH-CN9026483067
-
copyright : 四月的满月从圣迈克尔山上升起,英国康沃尔 (© Simon Maycock/Alamy Live News)
-
copyrightlink : https://www.bing.com/search?q=%E5%9C%A3%E7%B1%B3%E6%AD%87%E5%B0%94%E5%B1%B1&form=hpcapt&mkt=zh-cn
-
title :
-
quiz : /search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20200406_PinkMoon%22&FORM=HPQUIZ
-
wp : true
-
hsh : 571d8c115ed49dad56d5f1e678ddeeb1
-
drk : 1
-
top : 1
-
bot : 1
-
hs : []
*/
private String startdate;
private String fullstartdate;
private String enddate;
private String url;
private String urlbase;
private String copyright;
private String copyrightlink;
private String title;
private String quiz;
private boolean wp;
private String hsh;
private int drk;
private int top;
private int bot;
private List<?> hs;
public String getStartdate() {
return startdate;
}
public void setStartdate(String startdate) {
this.startdate = startdate;
}
public String getFullstartdate() {
return fullstartdate;
}
public void setFullstartdate(String fullstartdate) {
this.fullstartdate = fullstartdate;
}
public String getEnddate() {
return enddate;
}
public void setEnddate(String enddate) {
this.enddate = enddate;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUrlbase() {
return urlbase;
}
public void setUrlbase(String urlbase) {
this.urlbase = urlbase;
}
public String getCopyright() {
return copyright;
}
public void setCopyright(String copyright) {
this.copyright = copyright;
}
public String getCopyrightlink() {
return copyrightlink;
}
public void setCopyrightlink(String copyrightlink) {
this.copyrightlink = copyrightlink;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getQuiz() {
return quiz;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
Android开发除了flutter还有什么是必须掌握的吗?
相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了
除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-Q7L9m62W-1713112730964)]
[外链图片转存中…(img-sDcpwGR2-1713112730964)]
[外链图片转存中…(img-x6pgrqIQ-1713112730964)]
[外链图片转存中…(img-yAZjTEkp-1713112730965)]
[外链图片转存中…(img-AuT7vuN6-1713112730965)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
Android开发除了flutter还有什么是必须掌握的吗?
相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了
除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;
[外链图片转存中…(img-GgYY4Gfn-1713112730965)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!