高德地图SDK Android版开发 8 覆盖物示例2动画

2024-08-25 09:12

本文主要是介绍高德地图SDK Android版开发 8 覆盖物示例2动画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

高德地图SDK Android版开发 8 覆盖物示例2动画

  • 前言
  • 动画相关的类和接口
    • 帧动画
      • MarkerOptions
    • Animation动画
      • Animation类及其子类
        • Animation
        • TranslateAnimation
        • RotateAnimation
        • AlphaAnimation
        • ScaleAnimation
        • AnimationSet
  • Marker动画示例
    • 界面布局
    • MapMarkAnimate类
      • 常量
      • 成员变量
      • 初始值
      • 创建覆盖物
        • 创建Marker(帧动画)
        • 创建Marker(Animation动画)
        • 创建Marker(Demo动画)
        • 创建Animation
      • 移除覆盖物
      • 设置属性
      • 加载地图和释放地图
    • MapMarkerAnimationActivity类
      • 控件响应事件
    • 运行效果图

前言

前文介绍了高德地图Marker支持多种动画类型:

  • 帧动画;
  • Animation动画(包括平移、旋转、透明、缩放和组合动画)。

本文重点介绍Marker动画相关的类和接口,以及示例代码。

动画相关的类和接口

帧动画

帧动画的功能通过MarkerOptions类来设置,一次传入一个Icon列表,通过period设定刷新的帧间隔。

MarkerOptions

类型方法说明
MarkerOptionsicons(ArrayList< BitmapDescriptor > icons)设置Marker覆盖物的动画帧图标列表,多张图片模拟gif的效果。
MarkerOptionsperiod(int period)设置多少帧刷新一次图片资源,Marker动画的间隔时间,值越小动画越快。

Animation动画

Marker还支持设置旋转、缩放、平移、透明和组合动画效果。通过Marker类setAnimation方法设置。

说明说明
voidsetAnimation(Animation animation)设置动画。动画包含,旋转,缩放,消失,平移以及它们的组合动画
booleanstartAnimation()开始动画

Animation类及其子类

动画类别说明
抽象类Animation动画,可用于支持动画的覆盖物。使用方法如同Android系统自带的Animation
移动动画TranslateAnimation控制移动的动画类
旋转动画RotateAnimation控制旋转的动画类
透明度动画AlphaAnimation控制透明度的动画类
缩放动画ScaleAnimation控制缩放的动画类
组合动画AnimationSet动画集合
TranslateAnimation
+TranslateAnimation(latLng)
#String getAnimationType()
Animation
+int getFillMode()
+int getRepeatCount()
+int getRepeatMode()
+void setAnimationListener(listener)
+void setDuration(duration)
+void setFillMode(fillMode)
+void setInterpolator(interpolator)
+void setRepeatCount(repeatCount)
+void setRepeatMode(repeatMode)
RotateAnimation
+RotateAnimation(fromdegree, todegree)
#String getAnimationType()
AlphaAnimation
+AlphaAnimation(fromAlpha, toAlpha)
#String getAnimationType()
ScaleAnimation
+ScaleAnimation(fromX, toX, fromY, toY)
#String getAnimationType()
AnimationSet
+AnimationSet(shareInterpolator)
+void addAnimation(animation)
+void cleanAnimation()
#String getAnimationType()
Animation
说明说明
intgetFillMode()获取动画执行完成后的状态
intgetRepeatCount()获取动画重复执行的次数
intgetRepeatMode()重复执行的模式
voidsetAnimationListener(Animation.AnimationListener listener)设置动画监听器
voidsetDuration(long duration)设置动画持续时间。如果设置为负数,会修正为0
voidsetFillMode(int fillMode)设置动画执行完成后的状态。默认FILL_MODE_FORWARDS
voidsetInterpolator(Interpolator interpolator)设置插值器。默认是线性插值器
voidsetRepeatCount(int repeatCount)设置动画重复执行的次数。默认为0
voidsetRepeatMode(int repeatMode)重复执行的模式。默认RESTART
  • 常量
类型常量说明
static intFILL_MODE_BACKWARDS动画执行后保持在第一帧
static intFILL_MODE_FORWARDS动画执行后保持在最后一帧
static intINFINITE无限期地重复动画
static intRESTART动画结束后从头播放,最大重复次数受Animation.setRepeatCount(int) 限制
static intREVERSE动画结束后从尾倒放,最大重复次数受Animation.setRepeatCount(int) 限制
// 设置重复执行的模式
animation.setRepeatMode(Animation.RESTART);
// 设置动画执行后保持在第一帧
animation.setFillMode(Animation.FILL_MODE_BACKWARDS);
// 设置无限期地重复动画
animation.setRepeatCount(Animation.INFINITE);
  • AnimationListener 动画侦听
// 动画监听,包含动画开始和结束时的回调
public interface AnimationListener {// 动画开始回调void onAnimationStart();// 动画结束回调void onAnimationEnd();
}
TranslateAnimation
说明说明
TranslateAnimation(LatLng target)控制移动的动画类
protected StringgetAnimationType()
RotateAnimation
说明说明
RotateAnimation(float fromdegree, float todegree)控制旋转的动画类
protected StringgetAnimationType()
AlphaAnimation
说明说明
AlphaAnimation(float fromAlpha, float toAlpha)控制透明度的动画类。
透明度范围[0,1], 1为不透明
protected StringgetAnimationType()
ScaleAnimation
说明说明
ScaleAnimation(float fromX, float toX, float fromY, float toY)控制缩放的动画类。
比如要实现一个Marker生长动画,可以使用 (0,1,0,1)
protected StringgetAnimationType()
AnimationSet
说明说明
AnimationSet(boolean shareInterpolator)动画集合
voidaddAnimation(Animation animation)添加动画
voidcleanAnimation()清除动画
protected StringgetAnimationType()

Marker动画示例

本示例包括帧动画、Animation动画,以及官方Demo中的生长、跳跃和呼吸动画。

界面布局

在这里插入图片描述

  • 布局文件
<?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=".MapMarkerAnimationActivity"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="0dp"app:layout_constraintBottom_toTopOf="@id/bottomView"app:layout_constraintTop_toTopOf="parent" /><androidx.appcompat.widget.LinearLayoutCompatandroid:id="@+id/bottomView"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toBottomOf="@id/map"><RadioGroupandroid:id="@+id/RadioGroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/background_dark"android:gravity="center_horizontal"android:orientation="horizontal"android:paddingHorizontal="10dp"><RadioButtonandroid:id="@+id/frameAnimation"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:checked="true"android:onClick="setAnimationFlag"android:text="帧动画"android:textColor="@color/white"android:textStyle="bold" /><RadioButtonandroid:id="@+id/animation"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:onClick="setAnimationFlag"android:text="Animation动画"android:textColor="@color/white"android:textStyle="bold" /><RadioButtonandroid:id="@+id/demoAnimation"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:onClick="setAnimationFlag"android:text="Demo动画"android:textColor="@color/white"android:textStyle="bold" /></RadioGroup></androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

MapMarkAnimate类

  • 以下是MapMarkAnimate部分代码。

常量

public final static String FRAME_ANIMATION = "Frame"; // 帧动画public final static String TRANSFORMATION_ANIMATION = "Transformation"; // 平移动画
public final static String ROTATE_ANIMATION = "Rotate"; // 旋转动画
public final static String ALPHA_ANIMATION = "Alpha"; // 透明度动画
public final static String SCALE_ANIMATION = "Scale"; // 缩放动画
public final static String SINGLE_SCALE_ANIMATION = "SingleScale"; // 单边缩放动画 X或Y方向
public final static String ANIMATION_SET = "AnimationSet"; // 组合动画public final static String DEMO_GROW_ANIMATION = "Grow"; // Demo1 从地下生长
public final static String DEMO_JUMP_ANIMATION = "Jump"; // Demo2 跳跃
public final static String DEMO_BREATHE_ANIMATION = "Breathe"; // Demo3 呼吸

成员变量

// 覆盖物列表
List<BaseOverlay> overlays = new ArrayList<>();
// 选中的状态
List<String> selectedFlags = new ArrayList<>();
// 坐标点集
List<LatLng> points = new ArrayList<>();ArrayList<BitmapDescriptor> bitmaps = new ArrayList<>();
BitmapDescriptor circleBitmap;

初始值

selectedFlags.add(FRAME_ANIMATION);
selectedFlags.add(FRAME_ANIMATION);
selectedFlags.add(FRAME_ANIMATION);points.add(new LatLng(39.97923, 116.357428));
points.add(new LatLng(39.94923, 116.397428));
points.add(new LatLng(39.97923, 116.437428));
points.add(new LatLng(39.92353, 116.490705));
points.add(new LatLng(40.023537, 116.289429));
points.add(new LatLng(40.022211, 116.406137));int[] drawableIds = BubbleIcons.Number;
for (int drawableId : drawableIds) {BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(drawableId);bitmaps.add(bitmap);
}
circleBitmap = BitmapDescriptorFactory.fromResource(R.drawable.marker_circle_64);

创建覆盖物

public void addMarkers() {if (selectedFlags.isEmpty())return;int markerSize = selectedFlags.size();for (int i = 0; i < markerSize; ++i) {LatLng point = points.get(i);String flag = selectedFlags.get(i);switch (flag) {case FRAME_ANIMATION:addFrameAnimation(point, bitmaps);break;case DEMO_GROW_ANIMATION:case DEMO_JUMP_ANIMATION:addSampleAnimation(point, bitmaps.get(i), flag);break;case DEMO_BREATHE_ANIMATION:addBreatheAnimation(point);break;default:addAnimation(point, bitmaps.get(i), flag);break;}}
}
创建Marker(帧动画)
private void addFrameAnimation(LatLng point, ArrayList<BitmapDescriptor> bitmaps) {MarkerOptions option = new MarkerOptions().position(point) // 当前MarkerOptions对象的经纬度.icons(bitmaps) // Marker的动画帧列表.period(10); // 帧数, 刷新周期,值越小速度越快。默认为20,最小为1Marker marker = map.addMarker(option);overlays.add(marker);
}
创建Marker(Animation动画)
private void addAnimation(LatLng point, BitmapDescriptor bitmap, String flag) {Animation animation = null;switch (flag) {case TRANSFORMATION_ANIMATION:animation = getTransformation(point);break;case ROTATE_ANIMATION:animation = getRotateAnimation();break;case ALPHA_ANIMATION:animation = getAlphaAnimation();break;case SCALE_ANIMATION:animation = getScaleAnimation();break;case SINGLE_SCALE_ANIMATION:animation = getSingleScaleAnimation();break;case ANIMATION_SET:animation = getAnimationSet();break;}if (animation == null)return;MarkerOptions option = new MarkerOptions().position(point).icon(bitmap);Marker marker = map.addMarker(option);overlays.add(marker);marker.setAnimation(animation);marker.startAnimation();
}
创建Marker(Demo动画)
private void addSampleAnimation(LatLng point, BitmapDescriptor bitmap, String flag) {Animation animation = null;switch (flag) {case DEMO_GROW_ANIMATION:animation = getGrowAnimation();break;case DEMO_JUMP_ANIMATION:animation = getJumpAnimation(point);break;}if (animation == null)return;MarkerOptions option = new MarkerOptions().position(point).icon(bitmap);Marker marker = map.addMarker(option);overlays.add(marker);marker.setAnimation(animation);marker.startAnimation();
}private void addBreatheAnimation(LatLng point) {// breathe markerMarkerOptions option = new MarkerOptions().position(point).icon(circleBitmap).anchor(0.5f, 0.5f).zIndex(1);Marker breatheMarker = map.addMarker(option);overlays.add(breatheMarker);// center markerMarkerOptions centerOption = new MarkerOptions().position(point).icon(circleBitmap).anchor(0.5f, 0.5f).zIndex(2);Marker centerMarker = map.addMarker(centerOption);overlays.add(centerMarker);// 动画Animation animation = AnimationFactory.getBreatheAnimation();breatheMarker.setAnimation(animation);breatheMarker.startAnimation();
}
创建Animation
  • 创建平移动画、旋转动画、透明度动画、缩放动画、单边缩放动画、创建组合动画、生长动画、跳跃动画、呼吸动画。
// 创建平移动画
Animation getTransformation(LatLng point) {Point pt1 = map.getProjection().toScreenLocation(point);Point pt2 = new Point(pt1.x, pt1.y - 100);LatLng toPoint = map.getProjection().fromScreenLocation(pt2);TranslateAnimation animation = new TranslateAnimation(toPoint);// 设置动画持续时间animation.setDuration(500);// 设置重复执行的模式animation.setRepeatMode(Animation.RESTART);// 设置动画重复执行的次数animation.setRepeatCount(1);// 动画执行后保持在第一帧animation.setFillMode(Animation.FILL_MODE_BACKWARDS);animation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart() {// 动画开始回调}@Overridepublic void onAnimationEnd() {// 动画结束回调}});return animation;
}// 创建旋转动画
Animation getRotateAnimation() {RotateAnimation animation = new RotateAnimation(0f, 360f);// 设置动画持续时间animation.setDuration(1000);// 设置重复执行的模式animation.setRepeatMode(Animation.RESTART);// 设置动画重复执行的次数animation.setRepeatCount(1);// 动画执行后保持在第一帧animation.setFillMode(Animation.FILL_MODE_BACKWARDS);return animation;
}// 创建透明度动画
Animation getAlphaAnimation() {float fromAlpha = 1.0f;float toAlpha = 0.5f;AlphaAnimation animation = new AlphaAnimation(fromAlpha, toAlpha);// 设置动画持续时间animation.setDuration(3000);// 设置重复执行的模式animation.setRepeatMode(Animation.RESTART);// 设置动画重复执行的次数animation.setRepeatCount(1);// 动画执行后保持在第一帧animation.setFillMode(Animation.FILL_MODE_BACKWARDS);return animation;
}// 创建缩放动画
Animation getScaleAnimation() {float fromX = 1.0f; // 动画开始时横坐标位置float toX = 2.0f; // 动画结束时横坐标位置float fromY = 1.0f; // 动画开始时纵坐标位置float toY = 2.0f; // 动画结束时纵坐标位置ScaleAnimation animation = new ScaleAnimation(fromX, toX, fromY, toY);// 设置动画持续时间animation.setDuration(2000);// 设置重复执行的模式animation.setRepeatMode(Animation.RESTART);// 设置动画重复执行的次数animation.setRepeatCount(1);// 动画执行后保持在第一帧animation.setFillMode(Animation.FILL_MODE_BACKWARDS);return animation;
}// 单边缩放动画
Animation getSingleScaleAnimation() {float fromX = 1.0f; // 动画开始时横坐标位置float toX = 2.0f; // 动画结束时横坐标位置float fromY = 1.0f; // 动画开始时纵坐标位置float toY = 1.0f; // 动画结束时纵坐标位置ScaleAnimation animation = new ScaleAnimation(fromX, toX, fromY, toY);// 设置动画持续时间animation.setDuration(1000);// 设置重复执行的模式animation.setRepeatMode(Animation.RESTART);// 设置动画重复执行的次数animation.setRepeatCount(1);// 动画执行后保持在第一帧animation.setFillMode(Animation.FILL_MODE_BACKWARDS);return animation;
}// 添加组合动画
Animation getAnimationSet() {boolean shareInterpolator = true;AnimationSet animation = new AnimationSet(shareInterpolator);// 添加动画animation.addAnimation(getAlphaAnimation());animation.addAnimation(getRotateAnimation());animation.addAnimation(getScaleAnimation());// 设置插值器,默认是线性插值器animation.setInterpolator(new LinearInterpolator());return animation;
}// 地上生长
Animation getGrowAnimation() {float fromX = 0.0f; // 动画开始时横坐标位置float toX = 1.0f; // 动画结束时横坐标位置float fromY = 0.0f; // 动画开始时纵坐标位置float toY = 1.0f; // 动画结束时纵坐标位置ScaleAnimation animation = new ScaleAnimation(fromX, toX, fromY, toY);animation.setInterpolator(new LinearInterpolator());animation.setDuration(1000);return animation;
}// 跳跃动画
Animation getJumpAnimation(LatLng point) {// 根据屏幕距离计算需要移动的目标点Point pt1 = map.getProjection().toScreenLocation(point);Point pt2 = new Point(pt1.x, pt1.y - 100);LatLng toPoint = map.getProjection().fromScreenLocation(pt2);// 使用TranslateAnimation,填写一个需要移动的目标点Animation animation = new TranslateAnimation(toPoint);animation.setInterpolator(new Interpolator() {@Overridepublic float getInterpolation(float input) {// 模拟重加速度的interpolatorif (input <= 0.5) {return (float) (0.5f - 2 * (0.5 - input) * (0.5 - input));} else {return (float) (0.5f - Math.sqrt((input - 0.5f) * (1.5f - input)));}}});animation.setDuration(600);return animation;
}// 呼吸动画
Animation getBreatheAnimation() {// 动画执行完成后,默认会保持到最后一帧的状态boolean shareInterpolator = true;AnimationSet animationSet = new AnimationSet(shareInterpolator);// 1. 透明度动画float fromAlpha = 0.5f;float toAlpha = 0f;AlphaAnimation alphaAnimation = new AlphaAnimation(fromAlpha, toAlpha);alphaAnimation.setDuration(2000);// 设置不断重复alphaAnimation.setRepeatCount(Animation.INFINITE);// 2. 缩放动画float fromX = 1.0f; // 动画开始时横坐标位置float toX = 3.5f; // 动画结束时横坐标位置float fromY = 1.0f; // 动画开始时纵坐标位置float toY = 3.5f; // 动画结束时纵坐标位置ScaleAnimation scaleAnimation = new ScaleAnimation(fromX, toX, fromY, toY);scaleAnimation.setDuration(2000);// 设置不断重复scaleAnimation.setRepeatCount(Animation.INFINITE);// 添加动画animationSet.addAnimation(alphaAnimation);animationSet.addAnimation(scaleAnimation);// 设置插值器,默认是线性插值器animationSet.setInterpolator(new LinearInterpolator());return animationSet;
}

移除覆盖物

public void removeOverlay() {// 从地图上删除所有的覆盖物(marker,circle,polyline 等对象),// 但myLocationOverlay(内置定位覆盖物)除外。
//    boolean isKeepMyLocationOverlay = true;
//    map.clear(isKeepMyLocationOverlay);for (BaseOverlay overlay : overlays) {if (overlay instanceof Marker) {Marker marker = (Marker) overlay;marker.remove();}}overlays.clear();
}

设置属性

public void setFlags(List<String> flags) {selectedFlags.clear();selectedFlags.addAll(flags);removeOverlay();addMarkers();
}

加载地图和释放地图

public void onMapLoaded() {addMarkers();
}public void onMapDestroy() {removeOverlay();for (BitmapDescriptor bitmap : bitmaps) {bitmap.recycle();}bitmaps = null;if (circleBitmap != null)circleBitmap.recycle();circleBitmap = null;
}

MapMarkerAnimationActivity类

  • 以下是MapMarkerAnimationActivity类部分代码

控件响应事件

public void setAnimationFlag(View view) {boolean checked = ((RadioButton) view).isChecked();int id = view.getId();if (!checked)return;List<String> flags;if (id == R.id.frameAnimation) {flags = Arrays.asList(MapMarkerAnimation.FRAME_ANIMATION,MapMarkerAnimation.FRAME_ANIMATION,MapMarkerAnimation.FRAME_ANIMATION);} else if (id == R.id.animation) {flags = Arrays.asList(MapMarkerAnimation.TRANSFORMATION_ANIMATION,MapMarkerAnimation.ROTATE_ANIMATION,MapMarkerAnimation.ALPHA_ANIMATION,MapMarkerAnimation.SCALE_ANIMATION,MapMarkerAnimation.SINGLE_SCALE_ANIMATION,MapMarkerAnimation.ANIMATION_SET);} else if (id == R.id.demoAnimation) {flags = Arrays.asList(MapMarkerAnimation.DEMO_GROW_ANIMATION,MapMarkerAnimation.DEMO_JUMP_ANIMATION,MapMarkerAnimation.DEMO_BREATHE_ANIMATION);} else {return;}mapMarkerAnimation.setFlags(flags);
}

运行效果图

在这里插入图片描述

这篇关于高德地图SDK Android版开发 8 覆盖物示例2动画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105136

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit