圆角的实现方式

在Android项目中经常遇见圆角的图片的展示问题,但是很可惜,Android中的imageView并不是原生就支持圆角的,那么在Android中实现展示圆角图片的方式有几种呢?这里笔者大致总结一下分为以下几种

  • 自定义ImageView实现圆角
  • 通过Glide的BitmapTransformation实现圆角
  • 通过fresco的SimpleDraweeView实现
  • 通过外层嵌套一层CardView实现
  • 等等…

以上,其中2/3是借助其他图片加载库实现,1是需要自行实现ImageView中圆角的绘制函数,4需要布局多一层嵌套。
按照最简单的做法这里推荐使用CardView的方式实现圆角。

但是有时候UI设计师的设计图总是不是很如开发的口味,会出现上边需要圆角,底部无圆角的设计需求,那么这是时候,直接使用自定义ImageView造一个轮子方能一劳永逸。

下面贴代码:

/*** 提供为图片添加圆角、边框、剪裁到圆形或其他形状等功能。*/
public class RadiusImageView extends AppCompatImageView {private static final int DEFAULT_BORDER_COLOR = Color.GRAY;private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;private static final int COLOR_DRAWABLE_DIMEN = 2;private boolean mIsSelected = false;private boolean mIsOval = false;private boolean mIsCircle = false;private int mBorderWidth;private int mBorderColor;private int mSelectedBorderWidth;private int mSelectedBorderColor;private int mSelectedMaskColor;private boolean mIsTouchSelectModeEnabled = true;private int mCornerRadius;private boolean roundTopLeft = true,roundTopRight= true,roundBottomRight= true,roundBottomLeft= true;private Paint mBitmapPaint;private Paint mBorderPaint;private ColorFilter mColorFilter;private ColorFilter mSelectedColorFilter;private BitmapShader mBitmapShader;private boolean mNeedResetShader = false;private RectF mRectF = new RectF();private RectF mDrawRectF = new RectF();private Path path = null;private Bitmap mBitmap;private Matrix mMatrix;private int mWidth;private int mHeight;private ScaleType mLastCalculateScaleType;@IdResprivate int placeholderImage;public RadiusImageView(Context context) {this(context, null, R.attr.RadiusImageViewStyle);}public RadiusImageView(Context context, AttributeSet attrs) {this(context, attrs, R.attr.RadiusImageViewStyle);}public RadiusImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mBorderPaint = new Paint();mBorderPaint.setAntiAlias(true);mBorderPaint.setStyle(Paint.Style.STROKE);mMatrix = new Matrix();setScaleType(ScaleType.CENTER_CROP);TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RadiusImageView, defStyleAttr, 0);mBorderWidth = array.getDimensionPixelSize(R.styleable.RadiusImageView_borderWidth, 0);mBorderColor = array.getColor(R.styleable.RadiusImageView_borderColor, DEFAULT_BORDER_COLOR);mSelectedBorderWidth = array.getDimensionPixelSize(R.styleable.RadiusImageView_selectedBorderWidth, mBorderWidth);mSelectedBorderColor = array.getColor(R.styleable.RadiusImageView_selectedBorderColor, mBorderColor);mSelectedMaskColor = array.getColor(R.styleable.RadiusImageView_selectedMaskColor, Color.TRANSPARENT);if (mSelectedMaskColor != Color.TRANSPARENT) {mSelectedColorFilter = new PorterDuffColorFilter(mSelectedMaskColor, PorterDuff.Mode.DARKEN);}mIsTouchSelectModeEnabled = array.getBoolean(R.styleable.RadiusImageView_isTouchSelectModeEnabled, true);mIsCircle = array.getBoolean(R.styleable.RadiusImageView_isCircle, false);if (!mIsCircle) {mIsOval = array.getBoolean(R.styleable.RadiusImageView_isOval, false);}if (!mIsOval) {mCornerRadius = array.getDimensionPixelSize(R.styleable.RadiusImageView_cornerRadius, 0);roundTopLeft = array.getBoolean(R.styleable.RadiusImageView_roundTopLeft,true);roundTopRight = array.getBoolean(R.styleable.RadiusImageView_roundTopRight,true);roundBottomRight = array.getBoolean(R.styleable.RadiusImageView_roundBottomRight,true);roundBottomLeft = array.getBoolean(R.styleable.RadiusImageView_roundBottomLeft,true);}placeholderImage = array.getResourceId(R.styleable.RadiusImageView_placeholderImage,0);array.recycle();}@Overridepublic void setAdjustViewBounds(boolean adjustViewBounds) {if (adjustViewBounds) {throw new IllegalArgumentException("不支持adjustViewBounds");}}/*** 设置边框宽度* @param borderWidth borderWidth*/public void setBorderWidth(int borderWidth) {if (mBorderWidth != borderWidth) {mBorderWidth = borderWidth;invalidate();}}/*** 设置边框颜色* @param borderColor borderColor*/public void setBorderColor(@ColorInt int borderColor) {if (mBorderColor != borderColor) {mBorderColor = borderColor;invalidate();}}/*** 设置角半径* @param cornerRadius cornerRadius*/public void setCornerRadius(int cornerRadius) {if (mCornerRadius != cornerRadius) {mCornerRadius = cornerRadius;if (!mIsCircle && !mIsOval) {invalidate();}}}/*** 设置选定边框颜色* @param selectedBorderColor selectedBorderColor*/public void setSelectedBorderColor(@ColorInt int selectedBorderColor) {if (mSelectedBorderColor != selectedBorderColor) {mSelectedBorderColor = selectedBorderColor;if (mIsSelected) {invalidate();}}}/*** 设置选定的边框宽度* @param selectedBorderWidth selectedBorderWidth*/public void setSelectedBorderWidth(int selectedBorderWidth) {if (mSelectedBorderWidth != selectedBorderWidth) {mSelectedBorderWidth = selectedBorderWidth;if (mIsSelected) {invalidate();}}}/*** 设置选定的遮罩颜色* @param selectedMaskColor selectedMaskColor*/public void setSelectedMaskColor(@ColorInt int selectedMaskColor) {if (mSelectedMaskColor != selectedMaskColor) {mSelectedMaskColor = selectedMaskColor;if (mSelectedMaskColor != Color.TRANSPARENT) {mSelectedColorFilter = new PorterDuffColorFilter(mSelectedMaskColor, PorterDuff.Mode.DARKEN);} else {mSelectedColorFilter = null;}if (mIsSelected) {invalidate();}}mSelectedMaskColor = selectedMaskColor;}/*** 是否是圆* @param isCircle 是否*/public void setCircle(boolean isCircle) {if (mIsCircle != isCircle) {mIsCircle = isCircle;requestLayout();invalidate();}}/*** 是否是椭圆* @param isOval 是否*/public void setOval(boolean isOval) {boolean forceUpdate = false;if (isOval) {if (mIsCircle) {// 必须先取消圆形mIsCircle = false;forceUpdate = true;}}if (mIsOval != isOval || forceUpdate) {mIsOval = isOval;requestLayout();invalidate();}}/*** 设置圆角的位置* @param roundTopLeft roundTopLeft* @param roundTopRight roundTopRight* @param roundBottomRight roundBottomRight* @param roundBottomLeft roundBottomLeft*/public void setRoundedLocation(boolean roundTopLeft,boolean roundTopRight,boolean roundBottomRight,boolean roundBottomLeft){if (this.roundTopLeft!=roundTopLeft || this.roundTopRight!=roundTopRight|| this.roundBottomLeft!=roundBottomLeft || this.roundBottomRight!=roundBottomRight){this.roundTopLeft = roundTopLeft;this.roundTopRight = roundTopRight;this.roundBottomRight = roundBottomRight;this.roundBottomLeft = roundBottomLeft;requestLayout();invalidate();}}public int getBorderColor() {return mBorderColor;}public int getBorderWidth() {return mBorderWidth;}public int getCornerRadius() {return mCornerRadius;}public int getSelectedBorderColor() {return mSelectedBorderColor;}public int getSelectedBorderWidth() {return mSelectedBorderWidth;}public int getSelectedMaskColor() {return mSelectedMaskColor;}public boolean isCircle() {return mIsCircle;}public boolean isOval() {return !mIsCircle && mIsOval;}@Overridepublic boolean isSelected() {return mIsSelected;}@Overridepublic void setSelected(boolean isSelected) {if (mIsSelected != isSelected) {mIsSelected = isSelected;invalidate();}}public void setTouchSelectModeEnabled(boolean touchSelectModeEnabled) {mIsTouchSelectModeEnabled = touchSelectModeEnabled;}public boolean isTouchSelectModeEnabled() {return mIsTouchSelectModeEnabled;}public void setSelectedColorFilter(ColorFilter cf) {if (mSelectedColorFilter == cf) {return;}mSelectedColorFilter = cf;if (mIsSelected) {invalidate();}}@Overridepublic void setColorFilter(ColorFilter cf) {if (mColorFilter == cf) {return;}mColorFilter = cf;if (!mIsSelected) {invalidate();}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);if (widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY) {setMeasuredDimension(widthSize, heightSize);return;}if (mIsCircle) {if (widthMode == MeasureSpec.EXACTLY) {setMeasuredDimension(widthSize, widthSize);} else if (heightMode == MeasureSpec.EXACTLY) {setMeasuredDimension(heightSize, heightSize);} else {if (mBitmap == null) {setMeasuredDimension(0, 0);} else {int w = Math.min(mBitmap.getWidth(), widthSize);int h = Math.min(mBitmap.getHeight(), heightSize);int size = Math.min(w, h);setMeasuredDimension(size, size);}}return;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overridepublic void setImageDrawable(Drawable drawable) {super.setImageDrawable(drawable);setupBitmap();}@Overridepublic void setImageURI(Uri uri) {super.setImageURI(uri);setupBitmap();}private Bitmap getBitmap() {Drawable drawable = getDrawable();if (drawable == null) {return null;}if (drawable instanceof BitmapDrawable) {Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();if (bitmap == null) {return null;}float bmWidth = bitmap.getWidth(), bmHeight = bitmap.getHeight();if (bmWidth == 0 || bmHeight == 0) {return null;}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {// ensure minWidth and minHeightfloat minScaleX = getMinimumWidth() / bmWidth, minScaleY = getMinimumHeight() / bmHeight;if (minScaleX > 1 || minScaleY > 1) {float scale = Math.max(minScaleX, minScaleY);Matrix matrix = new Matrix();matrix.postScale(scale, scale);return Bitmap.createBitmap(bitmap, 0, 0, (int) bmWidth, (int) bmHeight, matrix, false);}}return bitmap;}try {Bitmap bitmap;if (drawable instanceof ColorDrawable) {bitmap = Bitmap.createBitmap(COLOR_DRAWABLE_DIMEN, COLOR_DRAWABLE_DIMEN, BITMAP_CONFIG);} else {bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);}Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());drawable.draw(canvas);return bitmap;} catch (Exception e) {e.printStackTrace();return null;}}public void setupBitmap() {Bitmap bm = getBitmap();if (bm == mBitmap) {return;}mBitmap = bm;if (mBitmap == null) {mBitmapShader = null;invalidate();return;}mNeedResetShader = true;mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);if (mBitmapPaint == null) {mBitmapPaint = new Paint();mBitmapPaint.setAntiAlias(true);}mBitmapPaint.setShader(mBitmapShader);requestLayout();invalidate();}private void updateBitmapShader() {mMatrix.reset();mNeedResetShader = false;if (mBitmapShader == null || mBitmap == null) {return;}updateMatrix(mMatrix, mBitmap, mRectF);mBitmapShader.setLocalMatrix(mMatrix);mBitmapPaint.setShader(mBitmapShader);}private void updateMatrix(@NonNull Matrix matrix, @NonNull Bitmap bitmap, RectF drawRect) {final float bmWidth = bitmap.getWidth();final float bmHeight = bitmap.getHeight();final ScaleType scaleType = getScaleType();if (scaleType == ScaleType.MATRIX) {updateScaleTypeMatrix(matrix, bitmap, drawRect);} else if (scaleType == ScaleType.CENTER) {float left = (mWidth - bmWidth) / 2;float top = (mHeight - bmHeight) / 2;matrix.postTranslate(left, top);drawRect.set(Math.max(0, left),Math.max(0, top),Math.min(left + bmWidth, mWidth),Math.min(top + bmHeight, mHeight));} else if (scaleType == ScaleType.CENTER_CROP) {float scaleX = mWidth / bmWidth, scaleY = mHeight / bmHeight;final float scale = Math.max(scaleX, scaleY);matrix.setScale(scale, scale);matrix.postTranslate(-(scale * bmWidth - mWidth) / 2, -(scale * bmHeight - mHeight) / 2);drawRect.set(0, 0, mWidth, mHeight);} else if (scaleType == ScaleType.CENTER_INSIDE) {float scaleX = mWidth / bmWidth, scaleY = mHeight / bmHeight;if (scaleX >= 1 && scaleY >= 1) {float left = (mWidth - bmWidth) / 2;float top = (mHeight - bmHeight) / 2;matrix.postTranslate(left, top);drawRect.set(left, top, left + bmWidth, top + bmHeight);} else {float scale = Math.min(scaleX, scaleY);matrix.setScale(scale, scale);float bw = bmWidth * scale, bh = bmHeight * scale;float left = (mWidth - bw) / 2;float top = (mHeight - bh) / 2;matrix.postTranslate(left, top);drawRect.set(left, top, left + bw, top + bh);}} else if (scaleType == ScaleType.FIT_XY) {float scaleX = mWidth / bmWidth, scaleY = mHeight / bmHeight;matrix.setScale(scaleX, scaleY);drawRect.set(0, 0, mWidth, mHeight);} else {float scaleX = mWidth / bmWidth, scaleY = mHeight / bmHeight;float scale = Math.min(scaleX, scaleY);matrix.setScale(scale, scale);float bw = bmWidth * scale, bh = bmHeight * scale;if (scaleType == ScaleType.FIT_START) {drawRect.set(0, 0, bw, bh);} else if (scaleType == ScaleType.FIT_CENTER) {float left = (mWidth - bw) / 2;float top = (mHeight - bh) / 2;matrix.postTranslate(left, top);drawRect.set(left, top, left + bw, top + bh);} else {matrix.postTranslate(mWidth - bw, mHeight - bh);drawRect.set(mWidth - bw, mHeight - bh, mWidth, mHeight);}}}protected void updateScaleTypeMatrix(@NonNull Matrix matrix, @NonNull Bitmap bitmap, RectF drawRect) {matrix.set(getImageMatrix());drawRect.set(0, 0, mWidth, mHeight);}private void drawBitmap(Canvas canvas, int borderWidth) {final float halfBorderWidth = borderWidth * 1.0f / 2;mBitmapPaint.setColorFilter(mIsSelected ? mSelectedColorFilter : mColorFilter);if (mIsCircle) {canvas.drawCircle(mRectF.centerX(), mRectF.centerY(), (Math.min(mRectF.width() / 2, mRectF.height() / 2)) - halfBorderWidth, mBitmapPaint);} else {mDrawRectF.left = mRectF.left + halfBorderWidth;//noinspection SuspiciousNameCombinationmDrawRectF.top = mRectF.top + halfBorderWidth;mDrawRectF.right = mRectF.right - halfBorderWidth;mDrawRectF.bottom = mRectF.bottom - halfBorderWidth;if (mIsOval) {canvas.drawOval(mDrawRectF, mBitmapPaint);} else {if (path == null){path = new Path();}path.addRoundRect(mDrawRectF,new float[] {roundTopLeft?mCornerRadius:0,roundTopLeft?mCornerRadius:0,roundTopRight?mCornerRadius:0,roundTopRight?mCornerRadius:0,roundBottomRight?mCornerRadius:0,roundBottomRight?mCornerRadius:0,roundBottomLeft?mCornerRadius:0,roundBottomLeft?mCornerRadius:0},Path.Direction.CW);canvas.drawPath(path, mBitmapPaint);}}}private void drawBorder(Canvas canvas, int borderWidth) {if (borderWidth <= 0) {return;}final float halfBorderWidth = borderWidth * 1.0f / 2;mBorderPaint.setColor(mIsSelected ? mSelectedBorderColor : mBorderColor);mBorderPaint.setStrokeWidth(borderWidth);if (mIsCircle) {canvas.drawCircle(mRectF.centerX(), mRectF.centerY(),Math.min(mRectF.width(), mRectF.height()) / 2 - halfBorderWidth, mBorderPaint);} else {mDrawRectF.left = mRectF.left + halfBorderWidth;//noinspection SuspiciousNameCombinationmDrawRectF.top = mRectF.top + halfBorderWidth;mDrawRectF.right = mRectF.right - halfBorderWidth;mDrawRectF.bottom = mRectF.bottom - halfBorderWidth;if (mIsOval) {canvas.drawOval(mDrawRectF, mBorderPaint);} else {if (path == null){path = new Path();}path.addRoundRect(mDrawRectF,new float[] {roundTopLeft?mCornerRadius:0,roundTopLeft?mCornerRadius:0,roundTopRight?mCornerRadius:0,roundTopRight?mCornerRadius:0,roundBottomRight?mCornerRadius:0,roundBottomRight?mCornerRadius:0,roundBottomLeft?mCornerRadius:0,roundBottomLeft?mCornerRadius:0},Path.Direction.CW);canvas.drawPath(path, mBitmapPaint);}}}@Overrideprotected void onDraw(Canvas canvas) {int width = getWidth(), height = getHeight();if (width <= 0 || height <= 0) {return;}int borderWidth = mIsSelected ? mSelectedBorderWidth : mBorderWidth;if (mBitmap == null || mBitmapShader == null) {drawBorder(canvas, borderWidth);return;}if (mWidth != width || mHeight != height|| mLastCalculateScaleType != getScaleType() || mNeedResetShader) {mWidth = width;mHeight = height;mLastCalculateScaleType = getScaleType();updateBitmapShader();}drawBitmap(canvas, borderWidth);drawBorder(canvas, borderWidth);}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (!this.isClickable()) {this.setSelected(false);return super.onTouchEvent(event);}if (!mIsTouchSelectModeEnabled) {return super.onTouchEvent(event);}switch (event.getAction()) {case MotionEvent.ACTION_DOWN:this.setSelected(true);break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_SCROLL:case MotionEvent.ACTION_OUTSIDE:case MotionEvent.ACTION_CANCEL:this.setSelected(false);break;}return super.onTouchEvent(event);}
}

自定义属性:

    <!--************** RadiusImageView ****************--><declare-styleable name="RadiusImageView"><attr name="borderWidth" format="dimension"/><attr name="borderColor" format="color"/><attr name="selectedMaskColor" format="color"/><attr name="selectedBorderColor" format="color"/><attr name="selectedBorderWidth" format="dimension"/><attr name="cornerRadius" format="dimension"/><attr name="isOval" format="boolean"/><attr name="isCircle" format="boolean"/><attr name="isTouchSelectModeEnabled" format="boolean"/><!-- Round the top-left corner. Ignored if isOval isCircle is used. --><attr format="boolean" name="roundTopLeft"/><!-- Round the top-right corner. Ignored if isOval isCircle is used. --><attr format="boolean" name="roundTopRight"/><!-- Round the bottom-right corner. Ignored if isOval isCircle is used. --><attr format="boolean" name="roundBottomRight"/><!-- Round the bottom-left corner. Ignored if isOval isCircle is used. --><attr format="boolean" name="roundBottomLeft"/><!-- A drawable or color to be be used as a placeholder. --><attr format="reference" name="placeholderImage"/></declare-styleable><attr name="RadiusImageViewStyle" format="reference"/>

简单使用

    <com.tao.radius.RadiusImageViewandroid:layout_width="50dp"android:layout_height="50dp"android:src="@color/black"app:cornerRadius="24dp"app:roundTopLeft="true"app:roundTopRight="true"app:roundBottomLeft="false"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" />

功能介绍:
支持绘制圆,椭圆,圆角,圆角控制支持四个角单独设置,边距,边距颜色,点击蒙版颜色等…

使用依赖:

//根build.gradle
maven { url 'https://jitpack.io' }//app build.gradle
dependencies {implementation 'com.github.huangtaoOO:RadiusImageView:Tag'
}

地址:https://github.com/huangtaoOO/RadiusImageView

评论回复不及时,有问题的小伙伴可以进Q群:682963103 提问

参考链接:https://github.com/Tencent/QMUI_Android

Android自定义ImageView圆角相关推荐

  1. Android开发之自定义ImageView圆角图片的方法

    老套路看图: 实现方法非常简单,使用ClipPath切割就可以了: 完整代码如下:dpUtils工具类就不发了,自己写下吧 import android.annotation.SuppressLint ...

  2. Android 自定义ImageView实现圆角图片

    圆角ImageView 大概就是这个样子的 四个直角改成圆角的 度数可以自定义 自定义ImageView 方法一:BitmapShader方式 首先简单了解下BitmapShader BitmapSh ...

  3. Android 自定义ImageView加载图片

    自定义imageview功能: 可以实现设置图片显示的时候,依据本身的比例进行图片的缩放 加载图片效果: 使用ImageLoader来加载 图片: 首先将ImageLoader的jar包关联到项目中 ...

  4. android 自定义ImageView控件实现圆形图片-适用于用户头像

    android开发中常常涉及到一种情况,就是将用户上传的图片以圆形样式显示,但是用户上传的图片可以有直角.圆角.正方形等多种不确定样式,这时就用到了自定义ImageView控件,在安卓客户端使接收到的 ...

  5. Android --- 自定义ImageView 实现圆形图片

    自定义ImageView实现圆形图片,主要是在onDraw()方法中实现绘制圆形图片,在onMeasure()中测量圆形的半径并设置View的宽高.效果如下图 代码如下 public class Ci ...

  6. android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果

    首先呢,还是一贯作风,我们先来看看众多应用中的示例:(这种效果是很常见的,可以说应用的必须品.)                搜狐客户端                               ...

  7. Android自定义Dialog+圆角处理

    目录 一.自定义Dialog 二.Dialog添加圆角 一.自定义Dialog 自定义Dialog实现过程 本文的自定义dialog是在fragment中实现的,在Activity里面应该大同小异了. ...

  8. Android 自定义ImageView线型渐变色渲染图片

    转载请注明出处:https://blog.csdn.net/htwhtw123/article/details/80787231 是一个尝试,结果实现了.用渐变色渲染图片资源,使图片变成水平线型渐变色 ...

  9. android 自定义ImageView实现图片手势滑动 多点触摸放大缩小效果

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转自:h ...

最新文章

  1. 2010.2--netscreen ssg 140 恢复出厂设置的方法
  2. redis(一) 安装以及基本数据类型操作
  3. pandas matplotlib 直播数据分析
  4. Express应用配置以及统一安装所需依赖和快速创建应用骨架
  5. AXIS2使用问题解决点滴
  6. Golang 学习笔记资源
  7. mysql官网二进制包_mysql二进制包安装与配置实战记录
  8. 基本类型和字符串互相转换
  9. 分享一个引起极度舒适的工作桌面
  10. element实现动态路由+面包屑
  11. navicat连接oracle 报 ORA-12737 set CHS16GBK
  12. Qt|C++工作笔记-QVector与Vector去重复的值
  13. MongoDB更新文档(非常详细,不要错过~)
  14. 修改sqlserver编码为utf8_修改Matlab默认编码格式为UTF-8
  15. 驱动开发入门 - 之二:Win7-x64 + VMWare (Win7-x64) + WinDbg 双机调试环境搭建
  16. KY-RTI分布仿真技术:第六章 Java程序设计
  17. Vue.js与Node.js一起打造一款属于自己的音乐App(收藏)
  18. 从同花顺获取涨停数据,视图化分析优质板,方便投资。
  19. vs mysql 开发erp_ERP/MIS开发 Mindscape NHibernate + MySQL 快速开发入门
  20. Excel批注教学:一键给多个单元格添加相同批注

热门文章

  1. char, unsigned char, int,unsigned int之间的相互转换
  2. pmp中ram和raci的区别_【PMP考前冲刺】知识点大全(六)
  3. 安卓11添加第三方输入法替换默认输入法
  4. 关于《机器学习实战》中创建决策树的核心代码分析
  5. 2022 最新 JCR正式发布全球最新影响因子名单(前600名)
  6. PyTorch实现断点继续训练
  7. icinga用NSCA监控远程Linux服务器
  8. 深度学习卷积神经网络重要结构之通道注意力和空间注意力模块
  9. 小程序更新后,wx.getUserInfo 接口不再出现授权弹窗,新方法获取用户信息
  10. Codeforces1486 C1.Guessing the Greatest (easy version)(交互题+二分)