安卓实现翻转时间显示效果

效果

 废话不多说上代码

自定义组件

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Camera;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.Scroller;
import android.widget.TextView;import java.util.Calendar;public class FlipLayout extends FrameLayout  {private TextView mVisibleTextView;//可见的private TextView mInvisibleTextView;//不可见private int layoutWidth;private int layoutHeight;private Scroller mScroller;private String TAG = "FlipLayout";private String timetag;//根据时间标记获取时间private Camera mCamera = new Camera();private Matrix mMatrix = new Matrix();private Rect mTopRect = new Rect();private Rect mBottomRect = new Rect();private boolean isUp = true;private Paint mminutenePaint = new Paint();private Paint mShadePaint = new Paint();private boolean isFlipping = false;private int maxNumber; //设置显示的最大值private int flipTimes = 0;private int timesCount = 0;private FlipOverListener mFlipOverListener;public FlipLayout(Context context) {super(context, null);}public FlipLayout(Context context, AttributeSet attrs) {super(context, attrs, 0);TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.FlipLayout);int resId = array.getResourceId(R.styleable.FlipLayout_flipTextBackground,-1);int color = Color.WHITE;if(-1 == resId){color = array.getColor(R.styleable.FlipLayout_flipTextBackground, Color.WHITE);}float size = array.getDimension(R.styleable.FlipLayout_flipTextSize,36);size = px2dip(context,size);int textColor = array.getColor(R.styleable.FlipLayout_flipTextColor, Color.BLACK);array.recycle();init(context,resId,color,size,textColor);}private void init(Context context, int resId, int color, float size, int textColor) {mScroller = new Scroller(context,new DecelerateInterpolator());//减速 动画插入器Typeface tf = Typeface.createFromAsset(context.getAssets(), "fonts/Aura.otf");mInvisibleTextView = new TextView(context);mInvisibleTextView.setTextSize(size);mInvisibleTextView.setText("00");mInvisibleTextView.setGravity(Gravity.CENTER);mInvisibleTextView.setIncludeFontPadding(false);mInvisibleTextView.setTextColor(textColor);mInvisibleTextView.setTypeface(tf);if(resId == -1){mInvisibleTextView.setBackgroundColor(color);}else {mInvisibleTextView.setBackgroundResource(resId);}addView(mInvisibleTextView);mVisibleTextView = new TextView(context);mVisibleTextView.setTextSize(size);mVisibleTextView.setText("00");mVisibleTextView.setGravity(Gravity.CENTER);mVisibleTextView.setIncludeFontPadding(false);mVisibleTextView.setTextColor(textColor);mVisibleTextView.setTypeface(tf);if(resId == -1){mVisibleTextView.setBackgroundColor(color);}else {mVisibleTextView.setBackgroundResource(resId);}addView(mVisibleTextView);mShadePaint.setColor(Color.BLACK);mShadePaint.setStyle(Paint.Style.FILL);mminutenePaint.setColor(Color.WHITE);mminutenePaint.setStyle(Paint.Style.FILL);}public FlipLayout(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public static float px2dip(Context context, float pxValue){final float scale = context.getResources().getDisplayMetrics().density;return pxValue / scale +0.5f;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);layoutWidth = MeasureSpec.getSize(widthMeasureSpec);layoutHeight = MeasureSpec.getSize(heightMeasureSpec);setMeasuredDimension(layoutWidth,layoutHeight);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);int count  = getChildCount();for(int i=0; i<count; i++){View child = getChildAt(i);child.layout(0,0,layoutWidth, layoutHeight);}mTopRect.top = 0;mTopRect.left = 0;mTopRect.right = getWidth();mTopRect.bottom = getHeight() / 2;mBottomRect.top = getHeight() / 2;mBottomRect.left = 0;mBottomRect.right = getWidth();mBottomRect.bottom = getHeight();}@Overridepublic void computeScroll() {//        Log.d(TAG,"computeScroll");//        if(!mScroller.isFinished() && mScroller.computeScrollOffset()){//            lastX = mScroller.getCurrX();//            lastY = mScroller.getCurrY();//            scrollTo(lastX,lastY);//            postInvalidate();//        }}@Overrideprotected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);if(!mScroller.isFinished() && mScroller.computeScrollOffset()){drawTopHalf(canvas);drawBottomHalf(canvas);drawFlipHalf(canvas);postInvalidate();}else {if(isFlipping){showViews(canvas);}if(mScroller.isFinished() && !mScroller.computeScrollOffset()){isFlipping = false;}if(timesCount < flipTimes){timesCount += 1;initTextView();isFlipping = true;mScroller.startScroll(0,0,0,layoutHeight,getAnimDuration(flipTimes - timesCount));postInvalidate();}else {timesCount = 0;flipTimes = 0;if(null != mFlipOverListener && !isFlipping()){mFlipOverListener.onFLipOver(FlipLayout.this);}}}}/**显示需要显示的数字* @param canvas*/private void showViews(Canvas canvas) {String current = mVisibleTextView.getText().toString();if(mVisibleTextView.getText().toString().length()<2){current = "0"+mVisibleTextView.getText().toString();}String past = mInvisibleTextView.getText().toString();if (mInvisibleTextView.getText().toString().length()<2){past = "0"+mInvisibleTextView.getText().toString();}mVisibleTextView.setText(past);mInvisibleTextView.setText(current);//防止切换抖动drawChild(canvas,mVisibleTextView,0);}/**画下半部分*/private void drawBottomHalf(Canvas canvas) {canvas.save();canvas.clipRect(mBottomRect);View drawView = isUp ? mInvisibleTextView : mVisibleTextView;drawChild(canvas,drawView,0);canvas.restore();}/**画上半部分*/private void drawTopHalf(Canvas canvas) {canvas.save();canvas.clipRect(mTopRect);View drawView = isUp ? mVisibleTextView : mInvisibleTextView;drawChild(canvas,drawView,0);canvas.restore();}/**画翻页部分*/private void drawFlipHalf(Canvas canvas) {canvas.save();mCamera.save();View view = null;float deg = getDeg();if(deg > 90){canvas.clipRect(isUp ? mTopRect : mBottomRect);mCamera.rotateX(isUp ? deg - 180 : -(deg - 180));view = mInvisibleTextView;}else {canvas.clipRect(isUp ? mBottomRect : mTopRect);mCamera.rotateX(isUp ? deg : -deg);view = mVisibleTextView ;}mCamera.getMatrix(mMatrix);positionMatrix();canvas.concat(mMatrix);if(view != null){drawChild(canvas,view,0);}drawFlippingShademinutene(canvas);mCamera.restore();canvas.restore();}private float getDeg() {return mScroller.getCurrY() * 1.0f / layoutHeight * 180;}/**绘制翻页时的阳面和阴面*/private void drawFlippingShademinutene(Canvas canvas) {final float degreesFlipped = getDeg();Log.d(TAG,"deg: " + degreesFlipped);if (degreesFlipped < 90) {final int alpha = getAlpha(degreesFlipped);Log.d(TAG,"小于90度时的透明度-------------------> " + alpha);mminutenePaint.setAlpha(alpha);mShadePaint.setAlpha(alpha);canvas.drawRect(isUp ? mBottomRect : mTopRect, isUp ? mminutenePaint : mShadePaint);} else {final int alpha = getAlpha(Math.abs(degreesFlipped - 180));Log.d(TAG,"大于90度时的透明度-------------> " + alpha);mShadePaint.setAlpha(alpha);mminutenePaint.setAlpha(alpha);canvas.drawRect(isUp ? mTopRect : mBottomRect, isUp ? mShadePaint : mminutenePaint);}}private int getAlpha(float degreesFlipped) {return (int) ((degreesFlipped / 90f) * 100);}private void positionMatrix() {mMatrix.preScale(0.25f, 0.25f);mMatrix.postScale(4.0f, 4.0f);mMatrix.preTranslate(-getWidth() / 2, -getHeight() / 2);mMatrix.postTranslate(getWidth() / 2, getHeight() / 2);}/**初始化隐藏textView显示的值*/private void initTextView() {int visibleValue = getTime();int invisibleValue = isUp ? visibleValue - 1 : visibleValue;if(invisibleValue < 0){invisibleValue += maxNumber;}if(invisibleValue >= maxNumber){invisibleValue -= maxNumber;}String value = String.valueOf(invisibleValue);if(value.length()<2){value = "0" +value;}mInvisibleTextView.setText(value);}/**根据传入的次数计算动画的时间* 控制翻页速度* */private int getAnimDuration(int times) {if(times <= 0){times = 1;}int animDuration = 500 - (500-100)/9 * times;return animDuration;}public static interface FlipOverListener{/*** 翻页完成回调* @param flipLayout    当前翻页的控件*/void onFLipOver(FlipLayout flipLayout);}//----------API-------------/*** 带动画翻动* 需要翻动几次* @param value 需要翻动的次数* @param isMinus  方向标识 true: 往上翻 - , false: 往下翻 +*/public void smoothFlip(int value,int maxnumber,String timeTAG, boolean isMinus){timetag = timeTAG;maxNumber = maxnumber;if(value <= 0){//回调接口if(null != mFlipOverListener){mFlipOverListener.onFLipOver(FlipLayout.this);}return;}flipTimes = value;this.isUp = isMinus;initTextView();isFlipping = true;mScroller.startScroll(0,0,0,layoutHeight,getAnimDuration(flipTimes - timesCount));timesCount = 1;postInvalidate();}/*** 不带动画翻动* @param value*/public void flip(int value,int maxnumber,String timeTAG){timetag = timeTAG;maxNumber = maxnumber;String text = String.valueOf(value);if(text.length()<2){text="0"+text;}mVisibleTextView.setText(text);}public void addFlipOverListener(FlipOverListener flipOverListener){this.mFlipOverListener = flipOverListener;}public TextView getmVisibleTextView() {return mVisibleTextView;}public TextView getmInvisibleTextView() {return mInvisibleTextView;}public boolean isUp() {return isUp;}public int getTimesCount() {return timesCount;}/**** @param resId 图片资源id*/public void setFlipTextBackground(int resId){int count = getChildCount();for(int i=0; i<count; i++){View child = getChildAt(i);if(null != child){child.setBackgroundResource(resId);}}}public void setFLipTextSize(float size){int count = getChildCount();for(int i=0; i<count; i++){TextView child = (TextView) getChildAt(i);if(null != child){child.setTextSize(size);}}}public void setFLipTextColor(int color){int count = getChildCount();for(int i=0; i<count; i++){TextView child = (TextView) getChildAt(i);if(null != child){child.setTextColor(color);}}}public boolean isFlipping (){return isFlipping && !mScroller.isFinished() && mScroller.computeScrollOffset();}public int getCurrentValue(){return Integer.parseInt(mVisibleTextView.getText().toString());}//获取时间private int getTime(){Calendar now = Calendar.getInstance();int hour = now.get(Calendar.HOUR_OF_DAY);int min = now.get(Calendar.MINUTE);int sec = now.get(Calendar.SECOND);switch(timetag){case "SECOND":return sec;case "MINUTE":return min;case "HOUR":return hour;}return 0;}
}

TimeTAG

public  class TimeTAG {public static String hour = "HOUR";public static String min = "MINUTE";public static String sec = "SECOND";}

MainActivity代码

public class MainActivity extends Activity implements View.OnClickListener, FlipLayout.FlipOverListener {private EditText etInput; // 输入框private Button btnSet; // 设置按钮private FlipLayout bit_hour; // 小时翻页布局private FlipLayout bit_minute; // 分钟翻页布局private FlipLayout bit_second; // 秒数翻页布局private Calendar oldNumber = Calendar.getInstance(); // 记录上次时间@Overrideprotected void onCreate(Bundle savedInstanceState) {setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 设置横屏显示super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); // 设置布局文件getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 保持屏幕常亮this.bit_second = (FlipLayout) findViewById(R.id.bit_flip_3); // 获取秒数翻页布局this.bit_minute = (FlipLayout) findViewById(R.id.bit_flip_2); // 获取分钟翻页布局this.bit_hour = (FlipLayout) findViewById(R.id.bit_flip_1); // 获取小时翻页布局bit_hour.flip(oldNumber.get(Calendar.HOUR_OF_DAY), 24, TimeTAG.hour); // 初始化小时翻页bit_minute.flip(oldNumber.get(Calendar.MINUTE), 60, TimeTAG.min); // 初始化分钟翻页bit_second.flip(oldNumber.get(Calendar.SECOND), 60, TimeTAG.sec); // 初始化秒数翻页new Timer().schedule(new TimerTask() {@Overridepublic void run() {start();}}, 1000, 1000); // 每一秒执行一次更新时间//        bit_hour.addFlipOverListener(this);
//        bit_minute.addFlipOverListener(this);
//        bit_second.addFlipOverListener(this);}@Overridepublic void onClick(View v) {start();}@Overridepublic void onFLipOver(FlipLayout flipLayout) {
//        if(flipLayout.isFlipping()){
//            flipLayout.smoothFlip(1, true);
//        }}public void start() {Calendar now = Calendar.getInstance();int nhour = now.get(Calendar.HOUR_OF_DAY);int nminute = now.get(Calendar.MINUTE);int nsecond = now.get(Calendar.SECOND);int ohour = oldNumber.get(Calendar.HOUR_OF_DAY);int ominute = oldNumber.get(Calendar.MINUTE);int osecond = oldNumber.get(Calendar.SECOND);oldNumber = now;int hour = nhour - ohour;int minute = nminute - ominute;int second = nsecond - osecond;if (hour >= 1 || hour == -23) {bit_hour.smoothFlip(1, 24, TimeTAG.hour, false);}if (minute >= 1 || minute == -59) {bit_minute.smoothFlip(1, 60, TimeTAG.min, false);}if (second >= 1 || second == -59) {bit_second.smoothFlip(1, 60, TimeTAG.sec, false);} // 当下一秒变为0时减去上一秒是-59}
}

布局代码

<?xml version="1.0" encoding="UTF-8"?><LinearLayout tools:context=".MainActivity"android:orientation="vertical"android:layout_height="match_parent"android:layout_width="match_parent"xmlns:tools="http://schemas.android.com/tools"xmlns:myFlip="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><LinearLayoutandroid:orientation="horizontal"android:layout_height="match_parent"android:layout_width="match_parent"android:background="@color/black"android:paddingTop="50dp"android:paddingBottom="50dp"android:paddingLeft="10dp"android:paddingRight="10dp"><androidx.cardview.widget.CardViewandroid:layout_height="match_parent"android:layout_width="0dp"android:layout_weight="1"app:cardCornerRadius="20dp"><FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><com.oraycn.time.FlipLayoutandroid:id="@+id/bit_flip_1"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"myFlip:flipTextBackground="#313131"myFlip:flipTextColor="@color/white"myFlip:flipTextSize="200sp" /><!-- 底部View上面的一条线 --><Viewandroid:layout_width="match_parent"android:layout_height="4dp"android:layout_gravity="center"android:background="@color/black"/></FrameLayout></androidx.cardview.widget.CardView><androidx.cardview.widget.CardViewandroid:layout_height="match_parent"android:layout_width="0dp"android:layout_weight="1"app:cardCornerRadius="20dp"android:layout_marginLeft="10dp"><FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><com.oraycn.time.FlipLayoutandroid:layout_height="match_parent"android:layout_width="match_parent"android:id="@+id/bit_flip_2"myFlip:flipTextColor="@color/white"myFlip:flipTextSize="200sp"myFlip:flipTextBackground="#313131"android:background="#ffffff"/><!-- 底部View上面的一条线 --><Viewandroid:id="@+id/last_price_line"android:layout_width="match_parent"android:layout_height="4dp"android:layout_gravity="center"android:background="@color/black"/></FrameLayout></androidx.cardview.widget.CardView><androidx.cardview.widget.CardViewandroid:layout_height="match_parent"android:layout_width="0dp"android:layout_weight="1"app:cardCornerRadius="20dp"android:layout_marginLeft="10dp"><FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><com.oraycn.time.FlipLayoutandroid:layout_height="match_parent"android:layout_width="match_parent"android:id="@+id/bit_flip_3"myFlip:flipTextColor="@color/white"myFlip:flipTextSize="200sp"myFlip:flipTextBackground="#313131"android:background="#333"/>  /><!-- 底部View上面的一条线 --><Viewandroid:layout_width="match_parent"android:layout_height="4dp"android:layout_gravity="center"android:background="@color/black"/></FrameLayout></androidx.cardview.widget.CardView></LinearLayout></LinearLayout>

效果

 对应案例;

https://download.csdn.net/download/qq_41733851/89008886?spm=1001.2014.3001.5503

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BM83 字符串变形

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param s string字符串 * param n int整型 * return string字符串*/public String trans (String s, int n) {// write co…

RK3568驱动指南|第十三篇 输入子系统-第143章 多对多的匹配关系分析

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

ubuntu20.04_PX4_1.13

说在前面&#xff1a;&#xff08;最好找一个干净的Ubuntu系统&#xff09;如果配置环境的过程中出现很多编译的错误或者依赖冲突&#xff0c;还是建议新建一个虚拟机&#xff0c;或者重装Ubuntu系统&#xff0c;这样会避免很多麻烦&#x1f490; &#xff0c; 安装PX4 1.13.2 …

小红书扫码登录分析与python实现

文章目录 1. 写在前面2. 接口分析3. 代码实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

代码随想录算法训练营第十七天(二叉树IV)| 110. 平衡二叉树、257. 二叉树的所有路径、404.左叶子之和(JAVA)

文章目录 110. 平衡二叉树解题思路源码 257. 二叉树的所有路径解题思路源码 404.左叶子之和解题思路源码 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7]输出&#xff1a;true 示例…

伊理威科技:抖音开网店新手刚做选啥品

在数字浪潮中&#xff0c;抖音不仅是展示才艺的舞台&#xff0c;更是创业者的新天地。新手若想在这片热土上开垦网店&#xff0c;选品便是首要课题。选择产品如同种下希望的种子&#xff0c;既要考量土壤肥沃度&#xff0c;也得预测风雨适宜期。 兴趣与专长是选品的罗盘。热爱所…

鸿蒙Harmony应用开发—ArkTS(@Extend装饰器:定义扩展组件样式)

在前文的示例中&#xff0c;可以使用Styles用于样式的扩展&#xff0c;在Styles的基础上&#xff0c;我们提供了Extend&#xff0c;用于扩展原生组件样式。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 装饰器使用说明 语法 Extend(UI…

光速论文能用吗 #媒体#知识分享#学习方法

光速论文是一个非常有效的论文写作、查重降重工具&#xff0c;它的使用非常简单方便&#xff0c;而且功能强大&#xff0c;是每个写作者必备的利器。 首先&#xff0c;光速论文具有强大的查重降重功能&#xff0c;能够快速检测论文中的抄袭部分&#xff0c;帮助作者避免不必要的…

用BSP优化3D渲染

3D渲染引擎设计者面临的最大问题之一是可见性计算&#xff1a;只必须绘制可见的墙壁和物体&#xff0c;并且必须以正确的顺序绘制它们&#xff08;应该在远处的墙壁前面绘制近墙&#xff09; 。 更重要的是&#xff0c;对于游戏等应用程序来说&#xff0c;开发能够快速渲染场景…

YOLO-v8-seg实例分割使用

最近需要实例分割完成一些任务&#xff0c;一直用的SAM(segment anything&#xff09;速度慢&#xff0c;找一个轻量分割模型。 1. YOLO-v8-seg使用 git clone https://github.com/ultralytics/ultralytics.git cd ultralytics vim run.py from ultralytics import YOLO# L…

Python虚拟环境conda的安装使用

文章目录 conda虚拟环境的详细步骤和注意事项&#xff1a;**安装Conda****创建Conda虚拟环境****激活Conda虚拟环境****安装Python包****管理Conda环境****其他优势与特性** 相较于venv&#xff0c;使用conda管理虚拟环境有以下优势&#xff1a;**性能****资源占用****其他性能…

nodejs安装使用React

1、react安装 首先&#xff0c;确保电脑上具备nodejs环境&#xff0c;之后用 winr 呼出控制台&#xff0c;输入 cmd 命令弹出cmd控制台&#xff08;小黑框&#xff09;之后在默认路径输入如下代码 npm i -g create-react-app //全局安装react环境无需选择特定文件夹安装成功后…

深度学习-2.9梯度不稳定和Glorot条件

梯度不稳定和Glorot条件 一、梯度消失和梯度爆炸 对于神经网络这个复杂系统来说&#xff0c;在模型训练过程中&#xff0c;一个最基础、同时也最常见的问题&#xff0c;就是梯度消失和梯度爆炸。 我们知道&#xff0c;神经网络在进行反向传播的过程中&#xff0c;各参数层的梯…

ADW300多功能无线计量仪表

仪表应用背景 电力运维行业&#xff1a;运维服务系统实时采集大量用户站的运行和动环数据&#xff0c;经专业数据分析&#xff0c;当用户站发生异常情况或运行故障时&#xff0c;及时反馈到运维指挥中心&#xff0c;并通过移动终端通知相应的运维工程师&#xff0c;指导现场作…

浅谈Javascript虚拟列表(virtaul list)改造成虚拟表格(virtaul table)的技术

前端加载百万条数据列表&#xff0c;如果采用真实的DOM插入100万个div&#xff08;或li&#xff09;标签&#xff0c;肯定是非常卡顿的。这就不得不使用虚拟列表技术方案&#xff0c;但是虚拟列表技术方案网上有很详细的实现方法&#xff0c;今天我就来谈谈根据网上的方案&…

Docker - 哲学 默认网络和 自定义网络 与 linux 网络类型 和 overlay2

默认网络&#xff1a;不指定 --nerwork 不指定 网络 run 一个容器时&#xff0c;会直接使用默认的网络桥接器 &#xff08;docker0&#xff09; 自定义网络&#xff1a;指定 --nerwork 让这两台容器互相通信 的前提 - 共享同一个网络 关于 ip addr 显示 ens160 储存驱动 ov…

入门linux之Ubuntu学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1、介绍Ubuntu2、虚拟机目录解析3、常用指令ls&#xff1a;罗列当前目录文件信息对ls -l 的结果解析1.第一个字符2.每三个字符&#xff08;第一个字符后&#x…

jmeter超高并发报错解决方法

1、比如jmeter设置并发量为5000&#xff0c;运行后报错socket closed。原因是客户端与服务端做了三次握手之后&#xff0c;后面不需要握手了&#xff0c;但是jmeter没有这个功能&#xff0c;5000个并发每次发接口请求都是独立的&#xff0c;jmeter端口处理不了这么大量的请求&a…

Android视角看鸿蒙第八课(module.json5中的各字段含义之abilities)下

Android视角看鸿蒙第八课(module.json5中的各字段含义之abilities&#xff09;下 导读 上篇文章开始学习abilities下的各字段含义&#xff0c;因为篇幅原因只学习了name、srcEntry、description、icon和label字段的含义和用法&#xff0c; 这篇文章继续学习和了解其他字段。 …

GPT4.0

GPT4.0 支持官网所有功能以及所有第三方GPTS&#xff0c;完全同步官网。无需魔法&#xff0c;填写授权码直达官网。全天超18小时维护&#xff0c;无需担心不稳定。没有永久卡&#xff0c;3.5免费提供&#xff0c;4.0可以按需下单即可&#xff0c;不存在跑路。 需要的联系