感谢作者无缘公子的文章:https://blog.csdn.net/zuiwuyuan/article/details/52105176

本文根据自身需求做了修改,实现点击添加标记,此文做记录

后面追加了长按移动标记点功能

演示图

好了,不想废话,源码很简单,直接上:


public class ImageLayout extends FrameLayout implements View.OnClickListener {private static final String TAG = "ImageLayout";private ArrayList<PointBean> points;private FrameLayout layouPoints;private ImageView imgBg;private OnClickViewPositionListener onClickViewPositionListener;private OnClickMarkerListener onClickMarkerListener;private int pointWidth; //图标宽private int pointHeight;//图标高private float startPositionW;//判断移动/点击private float startPositionH;private Context mContext;private View imgPointLayout;private int layoutHeight;private int layoutWidth;public ImageLayout(Context context) {this( context, null );}public ImageLayout(Context context, AttributeSet attrs) {this( context, attrs, 0 );}public ImageLayout(Context context, AttributeSet attrs, int defStyleAttr) {super( context, attrs, defStyleAttr );initView( context, attrs );}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure( widthMeasureSpec, heightMeasureSpec );}/*** wPercent:宽度百分比* hPercent:高度百分比*/public interface OnClickViewPositionListener {void onClickPercent(double wPercent, double hPercent);}/*** 点击标记*/public interface OnClickMarkerListener {void onClickPosition(int position);}public void setOnClickViewPositionListener(OnClickViewPositionListener onClickViewPositionListener) {this.onClickViewPositionListener = onClickViewPositionListener;}public void setOnClickMarkerListener(OnClickMarkerListener onClickMarkerListener) {this.onClickMarkerListener = onClickMarkerListener;}/*** 初始化view* @param context* @param attrs*/private void initView(Context context, AttributeSet attrs) {mContext = context;pointWidth = dp2px( mContext, 20 );//图标宽pointHeight = dp2px( mContext, 30 );//图标高imgPointLayout = inflate( context, R.layout.layout_imgview_point, this );imgBg = (ImageView) imgPointLayout.findViewById( R.id.imgBg );layouPoints = (FrameLayout) imgPointLayout.findViewById( R.id.layouPoints );}/*** 设置背景图* @param width layout宽* @param height layout高* @param imgUrl 图片地址*/public void setImgBg(int width, int height, String imgUrl) {layoutWidth = width;layoutHeight = height;ViewGroup.LayoutParams lp = imgBg.getLayoutParams();lp.width = width;lp.height = height;imgBg.setLayoutParams( lp );ViewGroup.LayoutParams lp1 = layouPoints.getLayoutParams();lp1.width = width;lp1.height = height;layouPoints.setLayoutParams( lp1 );Log.e( TAG, "setImgBg" + width + ":wh:" + height );Glide.with( mContext ).load( imgUrl ).into( imgBg );}/*** 设置点* @param points 点*/public void setPoints(ArrayList<PointBean> points) {if (layoutWidth <= 0 || layoutHeight <= 0) {return;}if (points == null) {return;}this.points = points;layouPoints.removeAllViews();for (int i = 0; i < points.size(); i++) {double width_scale = points.get( i ).widthScale;double height_scale = points.get( i ).heightScale;LinearLayout view = (LinearLayout) LayoutInflater.from( mContext ).inflate( R.layout.layout_img_point, this, false );ImageView imageView = (ImageView) view.findViewById( R.id.imgPoint );imageView.setTag( i );LayoutParams layoutParams = (LayoutParams) view.getLayoutParams();//根据需求自行调整icon位置int w = (int) ((layoutWidth * width_scale) - pointWidth / 2);//x的中间int h = (int) ((layoutHeight * height_scale) - pointHeight + pointHeight / 3);//图标y的底部layoutParams.leftMargin = w;layoutParams.topMargin = h;imageView.setOnClickListener( this );layouPoints.addView( view, layoutParams );}}/*** 触摸监听(获取点击手势)* @param event* @return*/@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {/*** 屏幕开始的位置*/case MotionEvent.ACTION_DOWN:startPositionW = event.getX();startPositionH = event.getY();Log.e( TAG, "位置:(开始)x"+startPositionW + ",y" + startPositionH );break;/*** 离开屏幕的位置*/case MotionEvent.ACTION_UP:if (Math.abs( startPositionW - event.getX() ) < 100 && Math.abs( startPositionH - event.getY() ) < 100) {//点击Log.e( TAG,"位置:(点击)" );Log.e( TAG, "位置:(结束)百分比x"+getPercent( event.getX(), getMeasuredWidth() ) + ":y:" +getPercent( event.getY(), getMeasuredHeight() ) );if (onClickViewPositionListener != null) {onClickViewPositionListener.onClickPercent( getPercent( event.getX(), getMeasuredWidth() ), getPercent( event.getY(), getMeasuredHeight() ) );}} else {//移动Log.e( TAG, "位置:(移动)" );}break;}return true;}/*** 将dp转换为与之相等的px*/public static int dp2px(Context context, float dipValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dipValue * scale + 0.5f);}//百分比计算public static double getPercent(double d, double e) {double p = d / e;DecimalFormat nf = (DecimalFormat) NumberFormat.getPercentInstance();nf.applyPattern( "0.00" );nf.setMaximumFractionDigits( 5 ); //表示精确到小数点后n位return Double.parseDouble( nf.format( p ) );}@Overridepublic void onClick(View view) {if (onClickMarkerListener != null){int index = (int) view.getTag();onClickMarkerListener.onClickPosition( index );}}}

ImageLayout的xml:

layout_img_point.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="vertical"><ImageViewandroid:id="@+id/imgPoint"android:layout_width="20dp"android:layout_height="30dp"android:src="@mipmap/position" /></LinearLayout>

layout_imgview_point.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/imgBg"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:adjustViewBounds="true"android:scaleType="fitXY" /><FrameLayoutandroid:id="@+id/layouPoints"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center" /></FrameLayout>

使用方式:

xml

<RelativeLayout 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=".MainActivity"><com.example.imgmarker.ImageLayoutandroid:id="@+id/layoutContent"android:layout_width="match_parent"android:layout_margin="10dp"android:layout_height="200dp"android:layout_centerVertical="true"/></RelativeLayout>
MainActivity
public class MainActivity extends AppCompatActivity {private ImageLayout layoutContent;private ArrayList<PointBean> pointSimples;private String imgUrl;Handler handler = new Handler( new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {switch (msg.what) {case 12:layoutContent.setImgBg( layoutContent.getMeasuredWidth(), layoutContent.getMeasuredHeight(), imgUrl );layoutContent.setPoints( pointSimples );break;}return false;}} );@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate( savedInstanceState );setContentView( R.layout.activity_main );layoutContent = findViewById( R.id.layoutContent );initView();initData();//延迟加载,获取宽高handler.sendEmptyMessageDelayed( 12, 1000 );}private void initView() {layoutContent.setOnClickViewPositionListener( new ImageLayout.OnClickViewPositionListener() {@Overridepublic void onClickPercent(final double wPercent, final double hPercent) {Log.e( "位置:这是外部:", "wPercent:" + wPercent + "hPercent" + hPercent );new AlertDialog.Builder( MainActivity.this ).setMessage( "确定添加点?" ).setPositiveButton( "确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();addPoint( wPercent, hPercent );}} ).setNegativeButton( "取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}} ).show();}} );layoutContent.setOnClickMarkerListener( new ImageLayout.OnClickMarkerListener() {@Overridepublic void onClickPosition(int position) {Toast.makeText( MainActivity.this, "index : " + position, Toast.LENGTH_SHORT ).show();}} );}private void addPoint(double wPercent, double hPercent) {PointBean pointSimple = new PointBean( wPercent, hPercent );pointSimples.add( pointSimple );layoutContent.setPoints( pointSimples );}private void initData() {//        imgUrl = "https://img.zcool.cn/community/0136985bc6cd7ba8012099c8a6bd2b.jpg";imgUrl = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimgm.gmw.cn%2Fattachement%2Fjpg%2Fsite2%2F20161020%2Ff44d305ea09619727dab29.jpg&refer=http%3A%2F%2Fimgm.gmw.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1612596118&t=a65a12ac754e82362cc4a2031df29f33";pointSimples = new ArrayList<>();PointBean pointSimple100 = new PointBean();pointSimple100.widthScale = 0.00f;pointSimple100.heightScale = 0.00f;PointBean pointSimple1 = new PointBean();pointSimple1.widthScale = 0.20f;pointSimple1.heightScale = 0.20f;PointBean pointSimple2 = new PointBean();pointSimple2.widthScale = 0.30f;pointSimple2.heightScale = 0.30f;PointBean pointSimple3 = new PointBean();pointSimple3.widthScale = 0.40f;pointSimple3.heightScale = 0.40f;PointBean pointSimple4 = new PointBean();pointSimple4.widthScale = 0.50f;pointSimple4.heightScale = 0.50f;PointBean pointSimple5 = new PointBean();pointSimple5.widthScale = 0.50f;pointSimple5.heightScale = 0.60f;PointBean pointSimple6 = new PointBean();pointSimple6.widthScale = 1f;pointSimple6.heightScale = 1f;pointSimples.add( pointSimple100 );pointSimples.add( pointSimple1 );pointSimples.add( pointSimple2 );pointSimples.add( pointSimple3 );pointSimples.add( pointSimple4 );pointSimples.add( pointSimple5 );pointSimples.add( pointSimple6 );}
}

代码更新了:公司新要求,继上面功能,多加一个长按移动标记点功能

主要实现方式是通过标记点触摸监听,判断是长按的情况下,做位置移动更改

主要代码:

/*** imageView监听** @param view* @param event* @return*/@Overridepublic boolean onTouch(View view, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d( TAG, "onTouch: ACTION_DOWN" );imgTimeDown = System.currentTimeMillis();isLongClick = false;imgDownX = event.getX();imgDownY = event.getY();break;case MotionEvent.ACTION_MOVE:Log.d( TAG, "onTouch: ACTION_MOVE" );imgTimeMove = System.currentTimeMillis();long durationMs = imgTimeMove - imgTimeDown;Log.d( TAG, "onTouch: durationMs=" + durationMs );if (Math.abs( imgDownX - event.getX() ) < 100 && Math.abs( imgDownY - event.getY() ) < 100 && durationMs > 500) {isLongClick = true;}if (isLongClick) {Log.d( TAG, "onTouch: isLongClick=" + isLongClick );//长按事件,可以移动//重新设置控件的位置。原位置加移动位置减去标记偏移量float mX = view.getX() + event.getX() ;float mY = view.getY() + event.getY() ;//限制移动范围if (mX < 0) {mX = 0;}if (mX > getMeasuredWidth()) {mX = getMeasuredWidth();}if (mY < 0) {mY = 0;}if (mY > getMeasuredHeight()) {mY = getMeasuredHeight();}view.setX( mX - pointWidthOffset);view.setY( mY - pointHeightOffset);}break;case MotionEvent.ACTION_UP:Log.d( TAG, "onTouch: ACTION_UP" );if (isLongClick) {//长按Log.d( TAG, "onTouch: ACTION_UP是长按:" +"tag:" + (int) view.getTag() +"最终位置x:" + view.getX() + ":y:" + view.getY() );if (onChangePositionListener != null) {onChangePositionListener.onChangePercent( (int) view.getTag(), getPercent( view.getX()+pointWidthOffset, getMeasuredWidth() ),getPercent( view.getY()+pointHeightOffset, getMeasuredHeight() ) );}}if (Math.abs( imgDownX - event.getX() ) < 100 && Math.abs( imgDownY - event.getY() ) < 100 && !isLongClick) {//点击if (onClickMarkerListener != null) {int index = (int) view.getTag();onClickMarkerListener.onClickPosition( index );}}break;}return true;}

更改之前的layout_img_point.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/imgPoint"android:layout_width="20dp"android:layout_height="30dp"android:src="@mipmap/position"></ImageView>

git图就不做了,现在贴出完整代码:


public class ImageLayout extends FrameLayout implements  View.OnTouchListener {private static final String TAG = "ImageLayout";private ArrayList<PointBean> points;private FrameLayout layouPoints;private ImageView imgBg;private OnClickViewPositionListener onClickViewPositionListener;private OnClickMarkerListener onClickMarkerListener;private OnChangePositionListener onChangePositionListener;private int pointWidth; //图标宽private int pointHeight;//图标高private int pointWidthOffset;//偏移量private int pointHeightOffset;private float startPositionW;//判断移动/点击private float startPositionH;private Context mContext;private View imgPointLayout;private int layoutHeight;private int layoutWidth;private long imgTimeDown;private boolean isLongClick;private float imgDownX;private float imgDownY;private long imgTimeMove;public ImageLayout(Context context) {this( context, null );}public ImageLayout(Context context, AttributeSet attrs) {this( context, attrs, 0 );}public ImageLayout(Context context, AttributeSet attrs, int defStyleAttr) {super( context, attrs, defStyleAttr );initView( context, attrs );}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure( widthMeasureSpec, heightMeasureSpec );}/*** 点击layout(空白区)* wPercent:宽度百分比* hPercent:高度百分比*/public interface OnClickViewPositionListener {void onClickPercent(double wPercent, double hPercent);}/*** 改变位置(改变标记点位置)* wPercent:宽度百分比* hPercent:高度百分比*/public interface OnChangePositionListener {void onChangePercent(int position, double wPercent, double hPercent);}/*** 点击标记*/public interface OnClickMarkerListener {void onClickPosition(int position);}public void setOnClickViewPositionListener(OnClickViewPositionListener onClickViewPositionListener) {this.onClickViewPositionListener = onClickViewPositionListener;}public void setOnClickMarkerListener(OnClickMarkerListener onClickMarkerListener) {this.onClickMarkerListener = onClickMarkerListener;}public void setOnChangePositionListener(OnChangePositionListener onChangePositionListener) {this.onChangePositionListener = onChangePositionListener;}/*** 初始化view** @param context* @param attrs*/private void initView(Context context, AttributeSet attrs) {mContext = context;pointWidth = dp2px( mContext, 20 );//图标宽pointHeight = dp2px( mContext, 30 );//图标高pointWidthOffset = pointWidth / 2;//图标x偏移量pointHeightOffset = (pointHeight / 3) * 2;//图标y偏移量imgPointLayout = inflate( context, R.layout.layout_imgview_point, this );imgBg = (ImageView) imgPointLayout.findViewById( R.id.imgBg );layouPoints = (FrameLayout) imgPointLayout.findViewById( R.id.layouPoints );}/*** 设置背景图** @param width  layout宽* @param height layout高* @param imgUrl 图片地址*/public void setImgBg(int width, int height, String imgUrl) {layoutWidth = width;layoutHeight = height;ViewGroup.LayoutParams lp = imgBg.getLayoutParams();lp.width = width;lp.height = height;imgBg.setLayoutParams( lp );ViewGroup.LayoutParams lp1 = layouPoints.getLayoutParams();lp1.width = width;lp1.height = height;layouPoints.setLayoutParams( lp1 );Log.e( TAG, "setImgBg" + width + ":wh:" + height );Glide.with( mContext ).load( imgUrl ).into( imgBg );}/*** 设置点** @param points 点*/public void setPoints(ArrayList<PointBean> points) {if (layoutWidth <= 0 || layoutHeight <= 0) {return;}if (points == null) {return;}this.points = points;layouPoints.removeAllViews();for (int i = 0; i < points.size(); i++) {double width_scale = points.get( i ).widthScale;double height_scale = points.get( i ).heightScale;ImageView imageView = (ImageView) LayoutInflater.from( mContext ).inflate( R.layout.layout_img_point, this, false );imageView.setTag( i );LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams();//根据需求自行调整icon位置int w = (int) ((layoutWidth * width_scale) - pointWidthOffset);//x的中间int h = (int) ((layoutHeight * height_scale) - pointHeightOffset);//图标y的底部layoutParams.leftMargin = w;layoutParams.topMargin = h;imageView.setOnTouchListener( this );layouPoints.addView( imageView, layoutParams );}}/*** 触摸监听(获取点击手势)** @param event* @return*/@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {/*** 屏幕开始的位置*/case MotionEvent.ACTION_DOWN:startPositionW = event.getX();startPositionH = event.getY();Log.e( TAG, "位置:(开始)x" + startPositionW + ",y" + startPositionH );break;/*** 离开屏幕的位置*/case MotionEvent.ACTION_UP:if (Math.abs( startPositionW - event.getX() ) < 100 && Math.abs( startPositionH - event.getY() ) < 100) {//点击Log.e( TAG, "位置:(点击)" );Log.e( TAG, "位置:(结束)百分比x" + getPercent( event.getX(), getMeasuredWidth() ) + ":y:" +getPercent( event.getY(), getMeasuredHeight() ) );if (onClickViewPositionListener != null) {onClickViewPositionListener.onClickPercent( getPercent( event.getX(), getMeasuredWidth() ), getPercent( event.getY(), getMeasuredHeight() ) );}} else {//移动Log.e( TAG, "位置:(移动)" );}break;}return true;}/*** imageView监听** @param view* @param event* @return*/@Overridepublic boolean onTouch(View view, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d( TAG, "onTouch: ACTION_DOWN" );imgTimeDown = System.currentTimeMillis();isLongClick = false;imgDownX = event.getX();imgDownY = event.getY();break;case MotionEvent.ACTION_MOVE:Log.d( TAG, "onTouch: ACTION_MOVE" );imgTimeMove = System.currentTimeMillis();long durationMs = imgTimeMove - imgTimeDown;Log.d( TAG, "onTouch: durationMs=" + durationMs );if (Math.abs( imgDownX - event.getX() ) < 100 && Math.abs( imgDownY - event.getY() ) < 100 && durationMs > 500) {isLongClick = true;}if (isLongClick) {Log.d( TAG, "onTouch: isLongClick=" + isLongClick );//长按事件,可以移动//重新设置控件的位置。原位置加移动位置减去标记偏移量float mX = view.getX() + event.getX() ;float mY = view.getY() + event.getY() ;//限制移动范围if (mX < 0) {mX = 0;}if (mX > getMeasuredWidth()) {mX = getMeasuredWidth();}if (mY < 0) {mY = 0;}if (mY > getMeasuredHeight()) {mY = getMeasuredHeight();}view.setX( mX - pointWidthOffset);view.setY( mY - pointHeightOffset);}break;case MotionEvent.ACTION_UP:Log.d( TAG, "onTouch: ACTION_UP" );if (isLongClick) {//长按Log.d( TAG, "onTouch: ACTION_UP是长按:" +"tag:" + (int) view.getTag() +"最终位置x:" + view.getX() + ":y:" + view.getY() );if (onChangePositionListener != null) {onChangePositionListener.onChangePercent( (int) view.getTag(), getPercent( view.getX()+pointWidthOffset, getMeasuredWidth() ),getPercent( view.getY()+pointHeightOffset, getMeasuredHeight() ) );}}if (Math.abs( imgDownX - event.getX() ) < 100 && Math.abs( imgDownY - event.getY() ) < 100 && !isLongClick) {//点击if (onClickMarkerListener != null) {int index = (int) view.getTag();onClickMarkerListener.onClickPosition( index );}}break;}return true;}/*** 将dp转换为与之相等的px*/public static int dp2px(Context context, float dipValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dipValue * scale + 0.5f);}//百分比计算public static double getPercent(double d, double e) {double p = d / e;DecimalFormat nf = (DecimalFormat) NumberFormat.getPercentInstance();nf.applyPattern( "0.00" );nf.setMaximumFractionDigits( 5 ); //表示精确到小数点后n位return Double.parseDouble( nf.format( p ) );}}

所有源码都在上面;

再附上demo一份,希望能帮助有需要的人(demo未更新,等我下次来更新吧)

地址:https://download.csdn.net/download/qq944639839/14040100

图片上添加自定义标记,可点击,可删除,可长按移动相关推荐

  1. html图片上传阅览并且点击放大

    关闭 qq_31540195的博客 目录视图 摘要视图 订阅 异步赠书:9月重磅新书升级,本本经典           程序员9月书讯      每周荐书:ES6.虚拟现实.物联网(评论送书) htm ...

  2. canvas在图片上绘制标记,可拖拽、缩放,基于ZRender

    如下图所示,在图片上做标记,如圆形.矩形等. 该demo实现画布在页面布局中缩放后居中显示,可拖拽.缩放.做标记说明. 项目下载地址:https://gitlab.com/zhangcw66/draw ...

  3. php怎么实现在图片上做标记,如何给图片添加标记(notes)?

    最近几天没有更新文章,有点小忙!呵呵,不说废话,直接进入正题. 今天主要说的是,如何在图片上添加标记(一个或多个).从网上搜到很多的例子,总体来说,感觉这个很不错!! 我就简单说一下这个标记是怎么存储 ...

  4. CentOS7设置静态IP、搭建单机版FastDFS图片服务器、使用FastDFS-Client客户端进行简单测试、实现图片上传、实现商品添加修改删除

    CentOS7设置静态IP.搭建单机版FastDFS图片服务器.使用FastDFS-Client客户端进行简单测试.实现图片上传.实现商品添加修改删除 CentOS7设置静态IP而且还可以上网 192 ...

  5. opencv在图片上做标记使用putText函数

    opencv图片上标记做出信息显示 cv2.puttext(img, '添加信息', (50, 50), 字体, 大小, (255, 0, 0), 2) font = cv2.FONT_HERSHEY ...

  6. 调用百度地图接口,在地图上添加标记并点击显示具体信息

    对于在想实现地图功能时,百度地图和高德地图都提供了很好的API接口,直接进入官网查找相应的开发文档即可. 我这里使用的是百度地图,首先你得申请一个百度的密钥,这个很简单,网上很多教程. 货不多说,下面 ...

  7. matlab在图片上画标记然后整幅保存的方法

    经常imshow一幅图片之后,会在上面plot一些标记点,但是imwrite的时候发现点并没有随之被保存下来. 尝试一些方法如下: 一.figure imshow(image0_rgb) hold o ...

  8. php图片上传在哪个文件夹,php删除上传的图片及文件夹

    以下为引用的内容: //wangsu820@163.com //2008-08-28 $folder = "D:\p8-server\wwwroot\\"."test\i ...

  9. 利用策略模式结合alibaba/alpha框架优化你的图片上传功能

    图片上传作为一个App经常用到的功能,项目中可以使用各种成熟的框架去完成,但往往实际的情况比想象的复杂.假设我们的上传功能需要满足下面的情况: 支持上传一张图 支持上传多张图 上传多张图时能获取到每张 ...

最新文章

  1. 图像增强算法四种,图示与源码,包括retinex(ssr、msr、msrcr)和一种混合算法
  2. rsync与inotify实现数据实时同步
  3. 【Python】选择数组中的数,拼接成一个最大字符串数(易错题,cmp_to_key举例)
  4. Git版本回退之 reset 和 revert
  5. 适合利用计算机模拟的是,计算机模拟在数学建模中的应用
  6. Selenium定位不到元素的解决方法—iframe挡住了去路
  7. python基础篇--从零开始(第一个程序)
  8. 【笔记】《编写高质量代码:改善c#程序的157个建议》-第1章 基本语言要素(SamWang)...
  9. Java位运算符:Java移位运算符、复合位赋值运算符及位逻辑运算符
  10. DB2数据库学习总结(一)——round函数用法
  11. cmd批处理命令~%dp0与~%dpn1的解析
  12. iphone双重认证关闭不了怎么办_iPhone双重认证怎么关闭?苹果手机关闭双重认证的两种方法[多图]...
  13. 2022-02-22 AndroidN之后 app代码安装apk,以及提示“There was a problem parsing the package“的解决方案
  14. 村田 - ESD 保护装置的基础知识
  15. Hbuilder开发APP(一)——底部导航条简单实现
  16. C# .net+DevExpress自定义控件(UserControl)之分页控件
  17. Pocket PC如何与PC机联网
  18. python上下对齐_python-docx设置表格对齐方式
  19. workflow开发注意事项
  20. mysql 查看时区_mysql 查看及修改时区的方法

热门文章

  1. java读取potx
  2. 南方电网广东公司荣获“IT用户最佳实践案例奖”
  3. 揭秘你喜欢的3D电影、游戏角色的制作过程!
  4. D0x-17(anti—Sp17)-3C12/TPGS抗精子蛋白单克隆抗体/维生素E聚乙二醇琥珀酸酯偶联阿霉素研究
  5. 嵌入式开发——程序跑飞原因总结
  6. Spring5底层原理 学习笔记(二)AOP篇
  7. 算法题---leetcode-1
  8. 超越阿里达摩院成绩,这个斯坦福团队用“国产求解器”助中国企业实现智能决策|快公司...
  9. BugKu_ez_java_serialize
  10. 操作系统可以控制和管理计算机的硬件资源,Windows操作系统是用来控制和管理计算机所有硬件和软件的...