仿微信通过拍照、本地图片然后裁剪完美更换头像

其实更换头像这个功能是个老梗了,写的人也很多,但是我没有看见过特别让我满意的,没办法,只能自己搞了。这里面我只说难点吧,最后的会附上完整的代码。

这里面涉及到的功能有哪些呢?
大概有:拍照 、扫描本地图片、裁剪、可以拖动放大缩小的图片、圆形头像,自认为还是比较不错的,代码风格可能能有改进,大家可以自行修改!~

一、首页main.activity

public class MainActivity extends AppCompatActivity {private CircleImageView headerPic;private TextView textView;private static final String IMAGE_FILE_LOCATION = ConstantSet.LOCALFILE;//拍照之后照片的输出文件路径File file ;Uri imageUri ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);headerPic=(CircleImageView)findViewById(R.id.headerImage);textView=(TextView)findViewById(R.id.updateImages);textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);View uv = getLayoutInflater().from(MainActivity.this).inflate(R.layout.upload_user_pic, null);TextView photograph = (TextView) uv.findViewById(R.id.Photograph);TextView selectPic = (TextView) uv.findViewById(R.id.selectImage_from_local);TextView dimissDialoag = (TextView) uv.findViewById(R.id.dimiss_dialoag);builder.setView(uv);//builder不能直接dimiss dialoag 需要取得show之后返回的alertdialoagfinal AlertDialog alertDialog = builder.show();MyDialoagListener myDialoagListener = new MyDialoagListener(alertDialog);photograph.setOnClickListener(myDialoagListener);selectPic.setOnClickListener(myDialoagListener);dimissDialoag.setOnClickListener(myDialoagListener);}});//判断文件目录是否存在file = new File(IMAGE_FILE_LOCATION);if(!file.exists()){//不存在的话就新建文件目录,注意在清单文件内添加权限SDCardUtils.makeRootDirectory(IMAGE_FILE_LOCATION);}file=new File(IMAGE_FILE_LOCATION+ConstantSet.USERTEMPPIC);imageUri = Uri.fromFile(file);}/**** 头像更改监听*/private class MyDialoagListener implements View.OnClickListener {private AlertDialog alertDialog;public MyDialoagListener(AlertDialog alertDialog) {this.alertDialog = alertDialog;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.Photograph:alertDialog.dismiss();//拍照Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intent, ConstantSet.TAKEPICTURE);break;case R.id.selectImage_from_local://从本地选择图片Intent sintent = new Intent(MainActivity.this, SelectImagesFromLocalActivity.class);startActivityForResult(sintent, ConstantSet.SELECTPICTURE);alertDialog.dismiss();break;case R.id.dimiss_dialoag:alertDialog.dismiss();break;}}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode != RESULT_OK) {return;}switch (requestCode) {case ConstantSet.TAKEPICTURE://拍照完成之后跳到裁剪页面Intent tcutIntent = new Intent(MainActivity.this, ClippingPageActivity.class);tcutIntent.putExtra("type", "takePicture");startActivityForResult(tcutIntent, ConstantSet.CROPPICTURE);break;case ConstantSet.SELECTPICTURE://本地图片选择完成之后跳转到裁剪页面Intent scutIntent = new Intent(MainActivity.this, ClippingPageActivity.class);scutIntent.putExtra("type", "selectPicture");scutIntent.putExtra("path",data.getStringExtra("path"));startActivityForResult(scutIntent, ConstantSet.CROPPICTURE);break;case ConstantSet.CROPPICTURE://裁剪之后的结果 这里面采用的是传输字节码,bitmap虽然序列化了,但是据说智能传输不超过40KB的,反正我这里试验了一下//用不了byte[] bis = data.getByteArrayExtra("result");Bitmap bitmap = BitmapFactory.decodeByteArray(bis, 0, bis.length);headerPic.setImageBitmap(bitmap);break;default:break;}}
}

首页效果大致就是这个样子:

首页述

二、SelectImagesFromLocalActivity 本地图片

public class SelectImagesFromLocalActivity extends AppCompatActivity implementsView.OnClickListener,ImagesFolderPopupWindow.FinishOnItemClickListener,AdapterView.OnItemClickListener {private DisplayImageOptions options = null;private GridView mgridView;private SpinnerProgressDialoag msp;private LinearLayout mSelectImages;private TextView mFolderName;private ImageGridViewAdapter madapter;private ImagesFolderPopupWindow pop;private ArrayList<ImageBean> marrayList=new ArrayList<>();//所有图片的数据private ArrayList<ImageFolderBean> arrayList=new ArrayList<>();//popuwindow的适配器数据源private HashMap<String,ArrayList<ImageBean>>  mgroupMap=new HashMap<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_select_from_local);msp=new SpinnerProgressDialoag(this);initTitle();mgridView=(GridView)findViewById(R.id.imagesGridView);mgridView.setOnItemClickListener(this);mSelectImages=(LinearLayout)findViewById(R.id.selectImagesFromFolder);mSelectImages.setOnClickListener(this);mFolderName=(TextView)findViewById(R.id.imagesFolderName);initImageLoader();madapter=new ImageGridViewAdapter(this,options);mgridView.setAdapter(madapter);pop=new ImagesFolderPopupWindow(this,options);pop.setFinishOnItemClickListener(this);new RequestLocalImages().execute();}private void initTitle() {ImageView rightImage = (ImageView) findViewById(R.id.id_img_right);TextView title = (TextView) findViewById(R.id.id_title);ImageView back = (ImageView) findViewById(R.id.id_back);rightImage.setVisibility(View.GONE);title.setText(getResources().getString(R.string.images));back.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {SelectImagesFromLocalActivity.this.finish();}});}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {ImageBean imageBean=(ImageBean)parent.getItemAtPosition(position);String path=imageBean.getImagePath();File file=new File(path);if(file.exists()) {Intent itToClip = new Intent();itToClip.putExtra("path", path);setResult(RESULT_OK, itToClip);this.finish();}}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.selectImagesFromFolder:pop.showPopupWindow(v);break;}}@Overridepublic void OnFinishedClick(String name) {madapter.setArrayList(mgroupMap.get(name));mFolderName.setText(name);}/**** 请求本地图片数据,扫描本地图片,存储到*/private class  RequestLocalImages extends AsyncTask<String,Integer,String>{public RequestLocalImages() {super();}@Overrideprotected String doInBackground(String... params) {Cursor imageCursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID},null, null, MediaStore.Images.Media._ID);//把存储所有图片的数据集合放到map中来mgroupMap.put(getResources().getString(R.string.all_images),marrayList);if (imageCursor != null && imageCursor.getCount() > 0) {while (imageCursor.moveToNext()) {ImageBean item = new ImageBean(imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)));mgroupMap.get(getResources().getString(R.string.all_images)).add(item);//每个图片都加入进去String parentPath=new File(item.getImagePath()).getParentFile().getName();//比较是否是同一个文件夹,如果不是的话,重建以文件夹为keyif(!mgroupMap.containsKey(parentPath)){ArrayList<ImageBean> arrayList=new ArrayList<>();arrayList.add(item);mgroupMap.put(parentPath,arrayList);}else{mgroupMap.get(parentPath).add(item);}}subGroupOfImage(mgroupMap);}return null;}@Overrideprotected void onPostExecute(String s) {madapter.setArrayList(mgroupMap.get(getResources().getString(R.string.all_images)));pop.setArrayList(arrayList);super.onPostExecute(s);}}/*** map集合中的数据添加到popwindow适配器数据源 集合 arraylist中* @param mgroupMap*/private void subGroupOfImage(HashMap<String,ArrayList<ImageBean>>  mgroupMap){if(mgroupMap==null||mgroupMap.size()==0){return;}Iterator<Map.Entry<String,ArrayList<ImageBean>>> iterator=mgroupMap.entrySet().iterator();while (iterator.hasNext()){Map.Entry<String,ArrayList<ImageBean>> entry=iterator.next();ImageFolderBean ifb=new ImageFolderBean();ifb.setFirstImage(entry.getValue().get(0).getImagePath());ifb.setFolderName(entry.getKey());ifb.setImages(entry.getValue().size());if(!entry.getKey().equals(getResources().getString(R.string.all_images))){ifb.setIsSelected(false);arrayList.add(ifb);}else{ifb.setIsSelected(true);arrayList.add(0,ifb);}}}private void initImageLoader() {if (options == null) {DisplayImageOptions.Builder displayBuilder = new DisplayImageOptions.Builder();displayBuilder.cacheInMemory(true);displayBuilder.cacheOnDisk(true);displayBuilder.showImageOnLoading(R.mipmap.default_photo);displayBuilder.showImageForEmptyUri(R.mipmap.default_photo);displayBuilder.considerExifParams(true);displayBuilder.bitmapConfig(Bitmap.Config.RGB_565);displayBuilder.imageScaleType(ImageScaleType.EXACTLY);displayBuilder.displayer(new FadeInBitmapDisplayer(300));options = displayBuilder.build();}if (!ImageLoader.getInstance().isInited()) {ImageLoaderConfiguration.Builder loaderBuilder = new ImageLoaderConfiguration.Builder(getApplication());loaderBuilder.memoryCacheSize(getMemoryCacheSize());try {File cacheDir = new File(getExternalCacheDir() + File.separator + ConstantSet.IMAGE_CACHE_DIRECTORY);loaderBuilder.diskCache(new LruDiskCache(cacheDir, DefaultConfigurationFactory.createFileNameGenerator(), 500 * 1024 * 1024));} catch (IOException e) {e.printStackTrace();}ImageLoader.getInstance().init(loaderBuilder.build());}}private int getMemoryCacheSize() {DisplayMetrics displayMetrics = getResources().getDisplayMetrics();int screenWidth = displayMetrics.widthPixels;int screenHeight = displayMetrics.heightPixels;// 4 bytes per pixelreturn screenWidth * screenHeight * 4 * 3;}
}

效果如图所示:
这里写图片描述

这里写图片描述

三、裁剪中最重要的可以拖动、缩放的imageView,当然很多代码网上都有,只不过我稍加改动
PerfectControlImageView

//完美的图片缩放,拖动,边界判断
public class PerfectControlImageView extends ImageView {float x_down = 0;float y_down = 0;PointF start = new PointF();PointF mid = new PointF();float oldDist = 1f;float oldRotation = 0;Matrix matrix = new Matrix();Matrix matrix1 = new Matrix();Matrix savedMatrix = new Matrix();private static final int NONE = 0;private static final int DRAG = 1;private static final int ZOOM = 2;int mode = NONE;boolean matrixCheck = false;int widthScreen;int heightScreen;private Bitmap gintama;private int titleHeight;public PerfectControlImageView(Context context) {this(context, null);}public PerfectControlImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.PerfectControlImageView,defStyleAttr,0);//获取到标题的高度titleHeight=typedArray.getDimensionPixelSize(R.styleable.PerfectControlImageView_titleHeight,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,59,getResources().getDisplayMetrics()));widthScreen= ScreenUtils.getScreenWidth(context);//当前view的宽度//计算当前view的高度heightScreen=ScreenUtils.getScreenHeight(context)-ScreenUtils.getStatusHeight(context)-  titleHeight;matrix = new Matrix();}public PerfectControlImageView(Context context, AttributeSet attrs) {this(context, attrs,0);}@Overridepublic void setImageBitmap(Bitmap bm) {this.gintama=bm;//初始化图片的matrix属性,让图片居中显示matrix.postTranslate((widthScreen-gintama.getWidth())/2,(heightScreen-gintama.getHeight())/2);}protected void onDraw(Canvas canvas) {canvas.save();canvas.drawBitmap(gintama, matrix, null);canvas.restore();}public boolean onTouchEvent(MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:mode = DRAG;x_down = event.getX();y_down = event.getY();savedMatrix.set(matrix);break;case MotionEvent.ACTION_POINTER_DOWN:mode = ZOOM;oldDist = spacing(event);
//                oldRotation = rotation(event);savedMatrix.set(matrix);midPoint(mid, event);break;case MotionEvent.ACTION_MOVE:if (mode == ZOOM) {matrix1.set(savedMatrix);
//                    float rotation = rotation(event) - oldRotation;float newDist = spacing(event);float scale = newDist / oldDist;matrix1.postScale(scale, scale, mid.x, mid.y);// 縮放
//                    matrix1.postRotate(rotation, mid.x, mid.y);// 旋轉 //暂时去掉matrixCheck = matrixCheck();if (matrixCheck == false) {matrix.set(matrix1);invalidate();}} else if (mode == DRAG) {matrix1.set(savedMatrix);matrix1.postTranslate(event.getX() - x_down, event.getY()- y_down);// 平移matrixCheck = matrixCheck();matrixCheck = matrixCheck();if (matrixCheck == false) {matrix.set(matrix1);invalidate();}}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_POINTER_UP:mode = NONE;break;}return true;}private boolean matrixCheck() {float[] f = new float[9];matrix1.getValues(f);// 图片4个顶点的坐标float x1 = f[0] * 0 + f[1] * 0 + f[2];float y1 = f[3] * 0 + f[4] * 0 + f[5];float x2 = f[0] * gintama.getWidth() + f[1] * 0 + f[2];float y2 = f[3] * gintama.getWidth() + f[4] * 0 + f[5];float x3 = f[0] * 0 + f[1] * gintama.getHeight() + f[2];float y3 = f[3] * 0 + f[4] * gintama.getHeight() + f[5];float x4 = f[0] * gintama.getWidth() + f[1] * gintama.getHeight() + f[2];float y4 = f[3] * gintama.getWidth() + f[4] * gintama.getHeight() + f[5];// 图片现宽度double width = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));// 缩放比率判断if (width < widthScreen / 3 || width > widthScreen * 3) {return true;}// 出界判断if ((x1 < widthScreen / 3 && x2 < widthScreen / 3&& x3 < widthScreen / 3 && x4 < widthScreen / 3)|| (x1 > widthScreen * 2 / 3 && x2 > widthScreen * 2 / 3&& x3 > widthScreen * 2 / 3 && x4 > widthScreen * 2 / 3)|| (y1 < heightScreen / 3 && y2 < heightScreen / 3&& y3 < heightScreen / 3 && y4 < heightScreen / 3)|| (y1 > heightScreen * 2 / 3 && y2 > heightScreen * 2 / 3&& y3 > heightScreen * 2 / 3 && y4 > heightScreen * 2 / 3)) {return true;}return false;}// 触碰两点间距离private float spacing(MotionEvent event) {float x = event.getX(0) - event.getX(1);float y = event.getY(0) - event.getY(1);return (float)Math.sqrt(x * x + y * y);}// 取手势中心点private void midPoint(PointF point, MotionEvent event) {float x = event.getX(0) + event.getX(1);float y = event.getY(0) + event.getY(1);point.set(x / 2, y / 2);}// 取旋转角度private float rotation(MotionEvent event) {double delta_x = (event.getX(0) - event.getX(1));double delta_y = (event.getY(0) - event.getY(1));double radians = Math.atan2(delta_y, delta_x);return (float) Math.toDegrees(radians);}// 将移动,缩放以及旋转后的图层保存为新图片// 本例中沒有用到該方法,需要保存圖片的可以參考public Bitmap CreatNewPhoto() {Bitmap bitmap = Bitmap.createBitmap(widthScreen, heightScreen,Bitmap.Config.ARGB_8888); // 背景图片Canvas canvas = new Canvas(bitmap); // 新建画布canvas.drawBitmap(gintama, matrix, null); // 画图片canvas.save(Canvas.ALL_SAVE_FLAG); // 保存画布canvas.restore();return bitmap;}}

四、ClippingPageActivity

public class ClippingPageActivity extends AppCompatActivity {private PerfectControlImageView imageView;private CuttingFrameView cuttingFrameView;private Bitmap bitmap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_clipping_page);initTitle();cuttingFrameView = (CuttingFrameView) findViewById(R.id.cutingFrame);imageView = (PerfectControlImageView) findViewById(R.id.targetImage);if (getIntent().getStringExtra("type").equals("takePicture")) {bitmap = BitmapUtils.DecodLocalFileImage(ConstantSet.LOCALFILE + ConstantSet.USERTEMPPIC, this);} else {String path=getIntent().getStringExtra("path");bitmap = BitmapUtils.DecodLocalFileImage(path, this);}if (bitmap != null) {imageView.setImageBitmap(bitmap);}}/*** 初始化title*/private void initTitle() {ImageView rightImage = (ImageView) findViewById(R.id.id_img_right);TextView title = (TextView) findViewById(R.id.id_title);TextView righttext=(TextView)findViewById(R.id.id_text_right);ImageView back = (ImageView) findViewById(R.id.id_back);rightImage.setVisibility(View.GONE);righttext.setVisibility(View.VISIBLE);title.setText(getResources().getString(R.string.picture_cutting));back.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {ClippingPageActivity.this.finish();}});righttext.setText(getResources().getString(R.string.sure));righttext.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {SpinnerProgressDialoag sp=new SpinnerProgressDialoag(ClippingPageActivity.this);sp.show();//把裁剪过的图片保存到本地Bitmap bitmap=cuttingFrameView.takeScreenShot(ClippingPageActivity.this);SDCardUtils.saveMyBitmap(ConstantSet.LOCALFILE, ConstantSet.USERPIC, bitmap);//把裁剪过的图片转换成字节模式传递 这两个方法 选其一即可Intent it=new Intent();ByteArrayOutputStream baos=new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);byte [] bitmapByte =baos.toByteArray();it.putExtra("result", bitmapByte);setResult(RESULT_OK, it);sp.dismiss();ClippingPageActivity.this.finish();}});}}

主要的内容都在这里的,其它的代码,大家可以直接下载源码:

仿微信通过拍照或者本地图片裁剪完美更换头像
只要一份,最近积分不多啦。。O(∩_∩)O哈哈~

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

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

相关文章

android微信群聊功能,Android仿微信群聊头像效果

在网上找了些仿微信群聊头像的开源库后&#xff0c;发现没特别好用的&#xff0c;或者说满足我需求的&#xff0c;就只好在别人的基础上改了下&#xff0c;也就有了这样的自定义控件了&#xff0c;以此来实现微信群聊头像的效果&#xff0c;效果图如下所示&#xff1a; 主要实现…

android高仿微信UI点击头像显示大图片效果

用过微信的朋友朋友都见过微信中点击对方头像显示会加载大图&#xff0c;先贴两张图片说明下&#xff1a; 这种UI效果对用户的体验不错&#xff0c;今天突然有了灵感&#xff0c;试着去实现&#xff0c;结果就出来了。。 下面说说我的思路&#xff1a; 1.点击图片时跳转到另一…

Android高仿微信头像裁剪

最近公司的APP很多用户反应无法上传头像&#xff0c;于是打算修改原来头像裁剪的代码。参考微信、QQ、唱吧头像裁剪的操作&#xff0c;决定就仿微信头像裁剪来上传用户头像&#xff0c;在Android大神鸿洋的一篇高仿微信头像的博客(博客地址结尾会贴出来)的基础上加了一些代码&a…

Android仿微信群聊头像合成

最近碰见仿照微信头像的需求&#xff0c;提供多个url的组合头像&#xff0c;做成微信群聊一样的头像&#xff0c;网上查了下&#xff0c;有两类&#xff0c;一种是合成的&#xff0c;一种是多个view合并展示的&#xff0c;合成的做的感觉很简陋&#xff0c;不太满足需求&#x…

android 仿微信群聊头像 合成图片

android 仿微信群聊头像 合成图片&#xff0c;微信中可以显示出群头像为多个用户的头像网格&#xff0c;这里讲方法已经封装好&#xff0c; 如果有记得点赞哦&#xff01;&#xff01; 先看效果&#xff1a; 使用例子&#xff1a; Override public void onClick(View v) {P…

Android 仿QQ讨论组头像

一、效果图 二、实现 基本实现过程&#xff1a; 1.将原图片读取为bitmap 2.在Canvas画布上计算出图片位置&#xff0c;并绘制新的图片。 &#xff08;ps:计算位置对我来说是难点&#xff0c;花了好长时间&#xff09;&#xff1b; 三、源码 1.布局文件 <?xml version…

仿照微信或qq头像双击摇晃效果

1.资源文件anim下加入 cycles_anim.xml (插值器可以设置不同的插值器) <?xml version"1.0" encoding"utf-8"?> <cycleInterpolator xmlns:android"http://schemas.android.com/apk/res/android"android:cycles"2" />an…

Android之头像图片变圆形

一&#xff1a;效果图、 二&#xff1a;实现步骤、 1.自定义一个转换工具类、 package com.common.base.util;import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapShader; import an…

Android 高仿微信群聊头像

最近小编搞了一个仿微信群聊头像的一个功能&#xff0c;分享给大家...工作中需要实现仿钉钉群头像的一个功能&#xff0c;就是个人的头像拼到一起显示&#xff0c;看了一下市场上的APP好像微信的群聊头像是组合的&#xff0c;QQ的头像不是&#xff0c;别的好像也没有了。今天给…

QQ头像无法加载,显示初始默认头像的解决方法

前言 终于。。终于&#xff01;查过那么多资料&#xff0c;翻过无数带有蛛丝马迹的信息&#xff0c;根本没有人能解决我遇到的这个问题&#xff0c;它是如此独特&#xff0c;如此难以排查&#xff01;&#xff01; 删过文件、改过网络配置、本地测试过相关数据接口、重装过QQ、…

软考-数据库系统工程师

软考之数据库系统工程师 前言 怎么会突然想起来考这个呢&#xff1f;说实话很惭愧&#xff0c;大学四年&#xff0c;毕业两年多都不知道有这个证书&#xff0c;也是今天看朋友圈看到一个学妹晒出了自己的这个证书&#xff0c;也是软考但是不是数据库系统工程师&#xff0c;她…

数据库(SQL Sever)水平证书复习题

全国信息技术水平考试数据库应用系统设计技术水平证书&#xff08;SQL Server&#xff09;复习题 第一大题&#xff1a;单选题 数据库系统是数据库、硬件、软件和&#xff08; &#xff09;的集合体。 (A) DBMS (B) DBS © DB (D) DBA下列选项中&#xff0c;不属于数据模…

软考中级——数据库系统工程师

第十一章—事务管理 自己关于备考软考中级&#xff08;数据库系统工程师&#xff09;的一些知识点的补充文章目录 第十一章—事务管理1 事务的基本概念1.1事务定义语句1.2 事务的特性&#xff08;ACID&#xff09; 2 数据库的并发控制2.1事务调度2.2并发操作带来的问题2.3两段…

全国OSTA计算机高新技术SQLSever数据库四级证书--考证复习知识点集合(附下载地址)

全国OSTA计算机高新技术SQLSever四级证书 说明&#xff1a;没找到一样的图、但长就是长这样的。分享给即将考证的朋友们&#xff01;适合临场考试复习整理思路理顺&#xff01;有其他点问题欢迎提出&#xff01;谢谢&#xff01;祝逢考必过&#xff01;&#xff08;文末有文档下…

MSSQL SERVER DBA 2门证书考试

微软Microsoft 70-764 - Administering a SQL Database Infrastructure 和 70-765 - Provisioning SQL Databases考试心得 由于公司不涨工资&#xff0c;所以只能硬着头皮考个DBA证书增添个人色彩了。 微软的DBA需要2个考试&#xff0c;70-764和70-765. 由于疫情&#xff0c;所…

aspnet+sqlserver英语等级考试报名系统

考试报名数据处理系统的开发目的是使考试报名数据处理模式从手工记录转变成信息管理&#xff0c;为考试报名数据处理人员提供方便条件。对考试报名的实际情况进行调研之后&#xff0c;进行详细的需求分析&#xff0c;目 录 摘 要 I Abstract II 1 引言 1 1.1 项…

华为鸿蒙HarmonyOS 4定档8月;ChatGPT之父的加密货币正式上线;微软必应聊天将推出重新生成答案功能|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

注册Gmail邮箱

注册Gmail邮箱 文章目录 注册Gmail邮箱1. 安装谷歌浏览器2. 注册Gmail邮箱2.1 创建新账号2.2 填写信息2.3 设置邮箱地址2.4 不用填号码直接跳过&#xff01;2.5 同意隐私条款2.6 返回登录2.7 访问油管验证成功 1. 安装谷歌浏览器 vivo自带的应用商店 2. 注册Gmail邮箱 2.1 …

Email,电子邮箱免费注册流程

工欲善其事&#xff0c;必先利其器。要做好工作&#xff0c;先要有锋利的工具。日常办公也是一样&#xff0c;申请一个好用的电子邮箱很重要&#xff0c;同事客户之间发送个文件都可以通过电子邮箱进行&#xff0c;并且现在很多平台注册帐号都需要填写email&#xff0c;比如百度…