文档章节

Android UI 之居中绘制文本内容的正确方法——实现自定义一个TextView

SuShine
 SuShine
发布于 2015/06/25 15:27
字数 1832
阅读 12
收藏 1
点赞 0
评论 0

原文地址 http://blog.csdn.net/carrey1989/article/details/10399727   


我们在自定义一个控件的时候,有时候会需要自己来绘制一些文本内容,这样就自然而然遇到确定文本的方位的问题,比如文本需要水平居中,垂直居中,居左,居右,左上。。。等等很多情况。其中最常见的就是文本位于控件的正中央了。

    既然是文本居中,那就要让文本水平居中,并且同时垂直居中,我们分开来做。

    水平居中的思路很简单,一种是得到控件的宽度A,使得文本的中心位置x坐标=A/2就可以了。还有一种思路是我们得到控件的宽度A,然后测量出要绘制的文本的宽度B,然后使得文本的左端x坐标=(A-B)/2。

    相对复杂一点的实现文本垂直居中,我们需要用到FontMetrics,这里涉及到几个概念,分别是文本的top,bottom,ascent,descent,baseline。看下面的图:


    我们在画布中绘制文本的时候,会调用Canvas.drawText(String text, float x, float y, Paint paint)这个方法,其中y的坐标就是上图中baseline的y坐标,所以,如果我们只是简单地把drawText方法中的y设置为控件高度的1/2是不准确的,如果这样做的话会发现文本整体是位于画布的上半部分的,因为baseline下面的文本部分是很小的。

    正确的做法是通过一些合理的换算使得文本的y坐标(baseline的y坐标)位于控件的下半部分区域。下面是我自己通过计算和测试得到的准确换算关系:

[java]  view plain copy
  1. float textCenterVerticalBaselineY = viewHeight / 2 - fm.descent + (fm.bottom - fm.top) / 2;  
    textCenterVerticalBaselineY就是绘制文本时候的y坐标,viewHeight是控件的高度。其实这个换算关系也不难理解,viewHeight/2-fm.descent的意思是将整个文字区域抬高到控件的1/2,然后我们再加上(fm.bottom - fm.top) / 2的意思就是将文本下沉文本top到bottom长度的一半,从而实现文本垂直居中的目的。

    有的人或许会问,为什么最后加上的是bottom到top距离的一半而不是descent到ascent的一半呢?其实这个是我测试的结果,我发现如果用bottom到top距离的一半来设置文本垂直居中,和系统控件TextView的文本居中效果是一样的,我们来看下面的效果:

    首先是我们使用(fm.bottom - fm.top) / 2:


    然后是使用(fm.descent - fm.ascent) / 2:


    左边绿色的是系统的TextView文字居中效果,右边是我们自定义控件的文字居中效果,可以看出使用(fm.bottom - fm.top) / 2与TextView的效果是一样的,当然,我们不必一定要与TextView的效果相同,所以使用(fm.descent - fm.ascent) / 2也是可以的。

    然后我们扩展一下,自定义一个可以控制内部文本绘制方位的TextView。

    先来看一下效果图:


项目代码:

MyTextView.java

[java]  view plain copy
  1. package com.example.textalignment.mytextview;  
  2.   
  3. import com.example.textalignment.util.DisplayParams;  
  4. import com.example.textalignment.util.DisplayUtil;  
  5.   
  6. import android.content.Context;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.Canvas;  
  9. import android.graphics.Color;  
  10. import android.graphics.Matrix;  
  11. import android.graphics.Paint;  
  12. import android.graphics.RectF;  
  13. import android.graphics.Paint.Align;  
  14. import android.graphics.Paint.FontMetrics;  
  15. import android.graphics.drawable.Drawable;  
  16. import android.util.AttributeSet;  
  17. import android.util.DisplayMetrics;  
  18. import android.view.View;  
  19. /** 
  20.  * 自定义文本显示控件 
  21.  * 该自定义控件中的文本可以在9个方位进行控制 
  22.  * 左上——中上——右上 
  23.  * 左中——中中——右中 
  24.  * 左下——中下——右下 
  25.  * @author carrey 
  26.  * 
  27.  */  
  28. public class MyTextView extends View {  
  29.       
  30.     /** 要显示的文字 */  
  31.     private String text;  
  32.     /** 文字的颜色 */  
  33.     private int textColor;  
  34.     /** 文字的大小 */  
  35.     private int textSize;  
  36.     /** 文字的方位 */  
  37.     private int textAlign;  
  38.       
  39. //  public static final int TEXT_ALIGN_CENTER            = 0x00000000;  
  40.     public static final int TEXT_ALIGN_LEFT              = 0x00000001;  
  41.     public static final int TEXT_ALIGN_RIGHT             = 0x00000010;  
  42.     public static final int TEXT_ALIGN_CENTER_VERTICAL   = 0x00000100;  
  43.     public static final int TEXT_ALIGN_CENTER_HORIZONTAL = 0x00001000;  
  44.     public static final int TEXT_ALIGN_TOP               = 0x00010000;  
  45.     public static final int TEXT_ALIGN_BOTTOM            = 0x00100000;  
  46.       
  47.     /** 文本中轴线X坐标 */  
  48.     private float textCenterX;  
  49.     /** 文本baseline线Y坐标 */  
  50.     private float textBaselineY;  
  51.       
  52.     /** 控件的宽度 */  
  53.     private int viewWidth;  
  54.     /** 控件的高度 */  
  55.     private int viewHeight;  
  56.     /** 控件画笔 */  
  57.     private Paint paint;  
  58.       
  59.     private FontMetrics fm;  
  60.     /** 场景 */  
  61.     private Context context;  
  62.       
  63.     public MyTextView(Context context) {  
  64.         super(context);  
  65.         this.context = context;  
  66.         init();  
  67.     }  
  68.   
  69.     public MyTextView(Context context, AttributeSet attrs) {  
  70.         super(context, attrs);  
  71.         this.context = context;  
  72.         init();  
  73.     }  
  74.   
  75.     /** 
  76.      * 变量初始化 
  77.      */  
  78.     private void init() {  
  79.         paint = new Paint();  
  80.         paint.setAntiAlias(true);  
  81.         paint.setTextAlign(Align.CENTER);  
  82.         //默认情况下文字居中显示  
  83.         textAlign = TEXT_ALIGN_CENTER_HORIZONTAL | TEXT_ALIGN_CENTER_VERTICAL;  
  84.         //默认的文本颜色是黑色  
  85.         this.textColor = Color.BLACK;  
  86.     }  
  87.       
  88.     @Override  
  89.     protected void onLayout(boolean changed, int left, int top, int right,  
  90.             int bottom) {  
  91.         viewWidth = getWidth();  
  92.         viewHeight = getHeight();  
  93.         super.onLayout(changed, left, top, right, bottom);  
  94.     }  
  95.       
  96.     @Override  
  97.     protected void onDraw(Canvas canvas) {  
  98.         //绘制控件内容  
  99.         setTextLocation();  
  100.         canvas.drawText(text, textCenterX, textBaselineY, paint);  
  101.         super.onDraw(canvas);  
  102.     }  
  103.       
  104.     /** 
  105.      * 定位文本绘制的位置 
  106.      */  
  107.     private void setTextLocation() {  
  108.         paint.setTextSize(textSize);  
  109.         paint.setColor(textColor);  
  110.         fm = paint.getFontMetrics();  
  111.         //文本的宽度  
  112.         float textWidth = paint.measureText(text);  
  113.         float textCenterVerticalBaselineY = viewHeight / 2 - fm.descent + (fm.descent - fm.ascent) / 2;  
  114.         switch (textAlign) {  
  115.         case TEXT_ALIGN_CENTER_HORIZONTAL | TEXT_ALIGN_CENTER_VERTICAL:  
  116.             textCenterX = (float)viewWidth / 2;  
  117.             textBaselineY = textCenterVerticalBaselineY;  
  118.             break;  
  119.         case TEXT_ALIGN_LEFT | TEXT_ALIGN_CENTER_VERTICAL:  
  120.             textCenterX = textWidth / 2;  
  121.             textBaselineY = textCenterVerticalBaselineY;  
  122.             break;  
  123.         case TEXT_ALIGN_RIGHT | TEXT_ALIGN_CENTER_VERTICAL:  
  124.             textCenterX = viewWidth - textWidth / 2;  
  125.             textBaselineY = textCenterVerticalBaselineY;  
  126.             break;  
  127.         case TEXT_ALIGN_BOTTOM | TEXT_ALIGN_CENTER_HORIZONTAL:  
  128.             textCenterX = viewWidth / 2;  
  129.             textBaselineY = viewHeight - fm.bottom;   
  130.             break;  
  131.         case TEXT_ALIGN_TOP | TEXT_ALIGN_CENTER_HORIZONTAL:  
  132.             textCenterX = viewWidth / 2;  
  133.             textBaselineY = -fm.ascent;  
  134.             break;  
  135.         case TEXT_ALIGN_TOP | TEXT_ALIGN_LEFT:  
  136.             textCenterX = textWidth / 2;  
  137.             textBaselineY = -fm.ascent;  
  138.             break;  
  139.         case TEXT_ALIGN_BOTTOM | TEXT_ALIGN_LEFT:  
  140.             textCenterX = textWidth / 2;  
  141.             textBaselineY = viewHeight - fm.bottom;   
  142.             break;  
  143.         case TEXT_ALIGN_TOP | TEXT_ALIGN_RIGHT:  
  144.             textCenterX = viewWidth - textWidth / 2;  
  145.             textBaselineY = -fm.ascent;  
  146.             break;  
  147.         case TEXT_ALIGN_BOTTOM | TEXT_ALIGN_RIGHT:  
  148.             textCenterX = viewWidth - textWidth / 2;  
  149.             textBaselineY = viewHeight - fm.bottom;   
  150.             break;  
  151.         }  
  152.     }  
  153.       
  154.     /** 
  155.      * 设置文本内容 
  156.      * @param text 
  157.      */  
  158.     public void setText(String text) {  
  159.         this.text = text;  
  160.         invalidate();  
  161.     }  
  162.     /** 
  163.      * 设置文本大小 
  164.      * @param textSizeSp 文本大小,单位是sp 
  165.      */  
  166.     public void setTextSize(int textSizeSp) {  
  167.         DisplayParams displayParams = DisplayParams.getInstance(context);  
  168.         this.textSize = DisplayUtil.sp2px(textSizeSp, displayParams.fontScale);  
  169.         invalidate();  
  170.     }  
  171.     /** 
  172.      * 设置文本的方位 
  173.      */  
  174.     public void setTextAlign(int textAlign) {  
  175.         this.textAlign = textAlign;  
  176.         invalidate();  
  177.     }  
  178.     /** 
  179.      * 设置文本的颜色 
  180.      * @param textColor 
  181.      */  
  182.     public void setTextColor(int textColor) {  
  183.         this.textColor = textColor;  
  184.         invalidate();  
  185.     }  
  186. }  
MainActivity.java

[java]  view plain copy
  1. package com.example.textalignment;  
  2.   
  3. import com.example.textalignment.mytextview.MyTextView;  
  4. import com.example.textalignment.util.DisplayParams;  
  5. import com.example.textalignment.util.DisplayUtil;  
  6.   
  7. import android.os.Bundle;  
  8. import android.app.Activity;  
  9. import android.graphics.Bitmap;  
  10. import android.graphics.BitmapFactory;  
  11. import android.graphics.Color;  
  12. import android.view.Menu;  
  13. import android.widget.LinearLayout;  
  14. import android.widget.ScrollView;  
  15.   
  16. public class MainActivity extends Activity {  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.           
  23.         DisplayParams displayParams = DisplayParams.getInstance(this);  
  24.           
  25.         LinearLayout container = (LinearLayout) findViewById(R.id.container);  
  26.           
  27.         MyTextView myTextView1 = new MyTextView(this);  
  28.         myTextView1.setText("居中的文本");  
  29.         myTextView1.setTextSize(30);  
  30.         myTextView1.setTextAlign(MyTextView.TEXT_ALIGN_CENTER_HORIZONTAL | MyTextView.TEXT_ALIGN_CENTER_VERTICAL);  
  31.         myTextView1.setTextColor(Color.BLUE);  
  32.         myTextView1.setBackgroundColor(Color.RED);  
  33.         container.addView(myTextView1, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  34.           
  35.         MyTextView myTextView2 = new MyTextView(this);  
  36.         myTextView2.setText("居左的文本");  
  37.         myTextView2.setTextSize(25);  
  38.         myTextView2.setTextAlign(MyTextView.TEXT_ALIGN_CENTER_VERTICAL | MyTextView.TEXT_ALIGN_LEFT);  
  39.         myTextView2.setTextColor(Color.GREEN);  
  40.         myTextView2.setBackgroundColor(Color.YELLOW);  
  41.         container.addView(myTextView2, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  42.           
  43.         MyTextView myTextView3 = new MyTextView(this);  
  44.         myTextView3.setText("右下的文本");  
  45.         myTextView3.setTextSize(15);  
  46.         myTextView3.setTextAlign(MyTextView.TEXT_ALIGN_BOTTOM | MyTextView.TEXT_ALIGN_RIGHT);  
  47.         myTextView3.setTextColor(Color.RED);  
  48.         myTextView3.setBackgroundColor(Color.BLUE);  
  49.         container.addView(myTextView3, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  50.           
  51.         MyTextView myTextView4 = new MyTextView(this);  
  52.         myTextView4.setText("左下的文本");  
  53.         myTextView4.setTextSize(15);  
  54.         myTextView4.setTextAlign(MyTextView.TEXT_ALIGN_BOTTOM | MyTextView.TEXT_ALIGN_LEFT);  
  55.         myTextView4.setTextColor(Color.YELLOW);  
  56.         myTextView4.setBackgroundColor(Color.GREEN);  
  57.         container.addView(myTextView4, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  58.           
  59.         MyTextView myTextView5 = new MyTextView(this);  
  60.         myTextView5.setText("中下的文本");  
  61.         myTextView5.setTextSize(35);  
  62.         myTextView5.setTextAlign(MyTextView.TEXT_ALIGN_BOTTOM | MyTextView.TEXT_ALIGN_CENTER_HORIZONTAL);  
  63.         myTextView5.setTextColor(Color.GRAY);  
  64.         myTextView5.setBackgroundColor(Color.RED);  
  65.         container.addView(myTextView5, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  66.           
  67.         MyTextView myTextView6 = new MyTextView(this);  
  68.         myTextView6.setText("居右的文本");  
  69.         myTextView6.setTextSize(25);  
  70.         myTextView6.setTextAlign(MyTextView.TEXT_ALIGN_RIGHT | MyTextView.TEXT_ALIGN_CENTER_VERTICAL);  
  71.         myTextView6.setTextColor(Color.BLUE);  
  72.         myTextView6.setBackgroundColor(Color.YELLOW);  
  73.         container.addView(myTextView6, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  74.           
  75.         MyTextView myTextView7 = new MyTextView(this);  
  76.         myTextView7.setText("左上的文本");  
  77.         myTextView7.setTextSize(25);  
  78.         myTextView7.setTextAlign(MyTextView.TEXT_ALIGN_TOP | MyTextView.TEXT_ALIGN_LEFT);  
  79.         myTextView7.setTextColor(Color.GREEN);  
  80.         myTextView7.setBackgroundColor(Color.CYAN);  
  81.         container.addView(myTextView7, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  82.           
  83.         MyTextView myTextView8 = new MyTextView(this);  
  84.         myTextView8.setText("中上的文本");  
  85.         myTextView8.setTextSize(25);  
  86.         myTextView8.setTextAlign(MyTextView.TEXT_ALIGN_TOP | MyTextView.TEXT_ALIGN_CENTER_HORIZONTAL);  
  87.         myTextView8.setTextColor(Color.RED);  
  88.         myTextView8.setBackgroundColor(Color.GREEN);  
  89.         container.addView(myTextView8, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  90.           
  91.         MyTextView myTextView9 = new MyTextView(this);  
  92.         myTextView9.setText("右上的文本");  
  93.         myTextView9.setTextSize(25);  
  94.         myTextView9.setTextAlign(MyTextView.TEXT_ALIGN_TOP | MyTextView.TEXT_ALIGN_RIGHT);  
  95.         myTextView9.setTextColor(Color.YELLOW);  
  96.         myTextView9.setBackgroundColor(Color.BLUE);  
  97.         container.addView(myTextView9, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtil.dip2px(150, displayParams.scale));  
  98.           
  99.     }  
  100. }  
activity_main.xml
[html]  view plain copy
  1. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <LinearLayout   
  12.         android:id="@+id/container"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:orientation="vertical"/>  
  16.   
  17. </ScrollView>  
另外,还用到了两个工具类,代码可以参考这篇文章http://blog.csdn.net/carrey1989/article/details/10360613

在进行垂直偏上和垂直偏下的设置时,关键是设置baseline的y坐标分别等于-fm.ascent和viewHeight - fm.bottom,意思就是可以让文字刚好不超过控件的边缘。

整体思路就是这样,如需转载,请注明转载地址http://blog.csdn.net/carrey1989/article/details/10399727


© 著作权归作者所有

共有 人打赏支持
SuShine
粉丝 118
博文 435
码字总数 88625
作品 0
青岛
后端工程师
Android | 自动调整文本大小的 TextViews

简评:Auto-Sizing TextViews —— 当 TextView 的布局边界尺寸发生变化时,文本大小可以跟着自动缩放调整。 有时候我们需要 TextView 根据放入的内容来改变其文本大小,之前 Android 对此并...

极小光 ⋅ 05/30 ⋅ 0

自定义View心法——View工作流程

前言 本文的目的有两个: 给对自定义View感兴趣的人一些入门的指引 给正在使用自定义View的人一些更深入的解析 自定义View一直都被认为是Android开发高手的必备技能,而稳中带皮的学习View的...

Alex_Payne ⋅ 05/24 ⋅ 0

[译] 论 Android 中 Span 的正确打开方式

原文地址:Underspanding spans 原文作者:Florina Muntenescu 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:tanglie1993 校对者:dandyxu, ALVINYEH Span 够为文字...

Android_开发者 ⋅ 06/05 ⋅ 0

自定义view控件效果实现及实践

项目需求讨论 - Android 自定义 Dialog 实现步骤及封装 根据实际项目需求出发。因为项目中的对话框要配合整个项目的 UI 风格,所以进行自定义 Dialog 的实现步骤,及最后写封装类。来快速实现...

掘金官方 ⋅ 2017/12/11 ⋅ 0

Android - 绘制带有渐变色的折线图

图表绘制的需求在安卓开发中并不少见。常见的有饼图,柱状图,折线图等等。 在这里,我们可以给折线图添加一些色彩。除了线条本身的颜色外,还可以增加一些“花样”——渐变色。填充空余的地...

RustFisher ⋅ 06/11 ⋅ 0

Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy ⋅ 2013/09/05 ⋅ 0

UI组件——TextView

1 TextView直接继承与View。 对每个控件都要关注:界面+ 事件。 界面是如何呈现的? 事件是如何实现的? 对每个控件做练习,并模仿商业app实现。 从最简单和最常见的控件来 约定: 特殊组件,...

sarashare ⋅ 2016/03/17 ⋅ 0

Android自定义View—带箭头文本

欢迎访问我的原文网址,查看网站效果及更多内容 本章将讲解下如何自定义一个带箭头指向的TextView,很简单,先看下效果 image 那么如何实现呢? 既然是文本,那么我们就新建一个类继承TextVie...

leach_chen ⋅ 03/18 ⋅ 0

Android-自定义View

Android 之自定义 View 的死亡三部曲之 Measure 我还不知道你的三围呢(你要占多少屏幕),我怎么能轻易让你出场呢? Android 自定义 View,ViewGroup(一)的一些原理与细节, 定义 Recycler...

掘金官方 ⋅ 01/03 ⋅ 0

自定义 View 中的文字测量和绘制

jordan-whitt 之前做 LeafLoadingView 的时候,进度到达 100 后,需要将风扇替换为文字。这里的文字当时还是让我头疼了一会的,不过最终用缩放解决了问题。这让我不禁想,安卓 sdk 中肯定有绘...

Arnold_J ⋅ 01/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部