android实现截图并动画消失
整体思路
1、获取要截图的view
2、根据这个view创建Bitmap
3、保存图片,拿到图片路径
4、把图片路径传入自定义view(自定义view实现的功能:画圆角边框,动画缩小至消失)
主要用到的是ObjectAnimator属性动画的缩小和平移
核心代码
得到图片的路径
private String getFilePath() {Bitmap bitmap = createViewBitmap(picImg);if (bitmap != null) {try {// 首先保存图片String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "HIS";File appDir = new File(storePath);if (!appDir.exists()) {appDir.mkdir();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);bos.flush();bos.close();Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);Uri uri = Uri.fromFile(file);intent.setData(uri);sendBroadcast(intent);return file.getAbsolutePath();} catch (Exception e) {return null;}} else {return null;}}
public Bitmap createViewBitmap(View v) {Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);v.draw(canvas);return bitmap;}
把图片路径传入自定义view
String filePath = getFilePath();mDisplayScreenshotSnv.setVisibility(View.GONE);mDisplayScreenshotSnv.setPath(filePath, picImg.getMeasuredWidth(), picImg.getMeasuredHeight(), true);mDisplayScreenshotSnv.setVisibility(View.VISIBLE);
截图实现圆角边框和动画消失
//实现截图动画(添加圆角边框)Glide.with(getContext()).load(new File(path)).transform(new CenterCrop(getContext()), new GlideRoundTransform(getContext(), radius)).crossFade().listener(new RequestListener<File, GlideDrawable>() {@Overridepublic boolean onException(Exception e, File model, Target<GlideDrawable> target, boolean isFirstResource) {if (anim) {anim(thumb, true);}return false;}@Overridepublic boolean onResourceReady(GlideDrawable resource, File model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {if (thumb.getDrawable() == null) {// 避免截图成功时出现短暂的全屏白色背景thumb.setImageDrawable(resource);}if (anim) {anim(thumb, true);}return false;}}).into(thumb);//启动延时关闭截图(显示5秒消失截图)startTick(true);
动画设置
/*** 动画设置* @param view* @param start*/private void anim(final ImageView view, boolean start) {if (!start) {if (getChildCount() > 0) {// 快速点击截图时,上一次添加的子视图尚未移除,需重置视图resetView();}setScaleX(1f);setScaleY(1f);setTranslationX(0f);setTranslationY(0f);clearAnimation();if (mScaleXAnim != null) {mScaleXAnim.cancel();mScaleXAnim = null;}if (mScaleYAnim != null) {mScaleYAnim.cancel();mScaleYAnim = null;}if (mTranslationXAnim != null) {mTranslationXAnim.cancel();mTranslationXAnim = null;}if (mTranslationYAnim != null) {mTranslationYAnim.cancel();mTranslationYAnim = null;}return;}view.post(new Runnable() {@Overridepublic void run() {if (!view.isAttachedToWindow()) {// 子视图已被移除return;}setCardBackgroundColor(Color.WHITE);//等待cross fade动画float margins = DisplayUtil.dip2px(getContext(), 10);float scaleToX = (float) mFinalW / getMeasuredWidth();float scaleToY = (float) mFinalH / getMeasuredHeight();float translateToX = -(getMeasuredWidth() / 2f - (mFinalW / 2 + margins));float translateToY = getMeasuredHeight() / 2f - (mFinalH / 2f + margins);//以当前view为中心,x轴右为正,左为负;y轴下为正,上为负mScaleXAnim = ObjectAnimator.ofFloat(ScreenshotNotifyView.this, "scaleX", 1.0f, scaleToX);mScaleYAnim = ObjectAnimator.ofFloat(ScreenshotNotifyView.this, "scaleY", 1.0f, scaleToY);mTranslationXAnim = ObjectAnimator.ofFloat(ScreenshotNotifyView.this, "translationX", 1.0f, translateToX);mTranslationYAnim = ObjectAnimator.ofFloat(ScreenshotNotifyView.this, "translationY", 1.0f, translateToY);//设置速度mScaleXAnim.setDuration(500);mScaleYAnim.setDuration(500);mTranslationXAnim.setDuration(500);mTranslationYAnim.setDuration(500);//缩放mScaleXAnim.start();mScaleYAnim.start();//平移mTranslationXAnim.start();mTranslationYAnim.start();setEnabled(false);mScaleXAnim.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationCancel(Animator animation) {super.onAnimationCancel(animation);setEnabled(true);}@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);setEnabled(true);setClickable(true);}@Overridepublic void onAnimationStart(Animator animation) {super.onAnimationStart(animation);}});}});}
完整代码
ScreenshotNotifyView.java
package com.lyw.myproject.widget;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.lyw.myproject.screenshot.GlideRoundTransform;
import com.lyw.myproject.utils.DisplayUtil;
import java.io.File;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;public class ScreenshotNotifyView extends CardView {private int mFinalW;private int mFinalH;private Handler mHandler;private ObjectAnimator mScaleXAnim = null;private ObjectAnimator mScaleYAnim = null;private ObjectAnimator mTranslationXAnim = null;private ObjectAnimator mTranslationYAnim = null;public ScreenshotNotifyView(@NonNull Context context) {super(context);init(context);}public ScreenshotNotifyView(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);init(context);}public ScreenshotNotifyView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}@Overridepublic void setVisibility(int visibility) {super.setVisibility(visibility);if (visibility == GONE) {resetView();}}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();anim(null, false);startTick(false);}private void init(Context context) {mHandler = new Handler(Looper.getMainLooper());setCardElevation(0);}public void setPath(final String path, int w, int h, final boolean anim) {setClickable(false);anim(null, false);final ImageView thumb = new ImageView(getContext());FrameLayout.LayoutParams thumbParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) getLayoutParams();int padding = (int) DisplayUtil.dip2px(getContext(), 2);int margins = (int) DisplayUtil.dip2px(getContext(), 8);//设置截图之后的宽度,高度按照比例设置mFinalW = (int) DisplayUtil.dip2px(getContext(), 90);mFinalH = (int) ((float) mFinalW * h) / w;if (!anim) {//设置边框params.setMargins(margins, margins, margins, margins);margins = (int) DisplayUtil.dip2px(getContext(), 2);params.width = mFinalW + margins * 2;params.height = mFinalH + margins * 2;params.gravity = Gravity.START | Gravity.BOTTOM;thumbParams.width = mFinalW;thumbParams.height = mFinalH;thumbParams.gravity = Gravity.CENTER;setLayoutParams(params);requestLayout();} else {//设置边框thumbParams.setMargins(margins, margins, margins, margins);params.setMargins(0, 0, 0, 0);params.width = FrameLayout.LayoutParams.MATCH_PARENT;params.height = FrameLayout.LayoutParams.MATCH_PARENT;setLayoutParams(params);requestLayout();}thumb.setScaleType(ImageView.ScaleType.FIT_XY);thumb.setLayoutParams(thumbParams);addView(thumb);post(new Runnable() {@Overridepublic void run() {float scale = (float) mFinalW / getMeasuredWidth();int radius = 5;if (anim) {radius = (int) (5f / scale);}setRadius((int) DisplayUtil.dip2px(getContext(), radius));//显示截图(添加圆角)Glide.with(getContext()).load(new File(path)).transform(new CenterCrop(getContext()), new GlideRoundTransform(getContext(), radius)).crossFade().listener(new RequestListener<File, GlideDrawable>() {@Overridepublic boolean onException(Exception e, File model, Target<GlideDrawable> target, boolean isFirstResource) {if (anim) {anim(thumb, true);}return false;}@Overridepublic boolean onResourceReady(GlideDrawable resource, File model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {if (thumb.getDrawable() == null) {// 避免截图成功时出现短暂的全屏白色背景thumb.setImageDrawable(resource);}if (anim) {anim(thumb, true);}return false;}}).into(thumb);//启动延时关闭截图(显示5秒消失截图)startTick(true);}});}/*** 动画设置* @param view* @param start*/private void anim(final ImageView view, boolean start) {if (!start) {if (getChildCount() > 0) {// 快速点击截图时,上一次添加的子视图尚未移除,需重置视图resetView();}setScaleX(1f);setScaleY(1f);setTranslationX(0f);setTranslationY(0f);clearAnimation();if (mScaleXAnim != null) {mScaleXAnim.cancel();mScaleXAnim = null;}if (mScaleYAnim != null) {mScaleYAnim.cancel();mScaleYAnim = null;}if (mTranslationXAnim != null) {mTranslationXAnim.cancel();mTranslationXAnim = null;}if (mTranslationYAnim != null) {mTranslationYAnim.cancel();mTranslationYAnim = null;}return;}view.post(new Runnable() {@Overridepublic void run() {if (!view.isAttachedToWindow()) {// 子视图已被移除return;}setCardBackgroundColor(Color.WHITE);//等待cross fade动画float margins = DisplayUtil.dip2px(getContext(), 10);float scaleToX = (float) mFinalW / getMeasuredWidth();float scaleToY = (float) mFinalH / getMeasuredHeight();float translateToX = -(getMeasuredWidth() / 2f - (mFinalW / 2 + margins));float translateToY = getMeasuredHeight() / 2f - (mFinalH / 2f + margins);//以当前view为中心,x轴右为正,左为负;y轴下为正,上为负mScaleXAnim = ObjectAnimator.ofFloat(ScreenshotNotifyView.this, "scaleX", 1.0f, scaleToX);mScaleYAnim = ObjectAnimator.ofFloat(ScreenshotNotifyView.this, "scaleY", 1.0f, scaleToY);mTranslationXAnim = ObjectAnimator.ofFloat(ScreenshotNotifyView.this, "translationX", 1.0f, translateToX);mTranslationYAnim = ObjectAnimator.ofFloat(ScreenshotNotifyView.this, "translationY", 1.0f, translateToY);//设置速度mScaleXAnim.setDuration(500);mScaleYAnim.setDuration(500);mTranslationXAnim.setDuration(500);mTranslationYAnim.setDuration(500);//缩放mScaleXAnim.start();mScaleYAnim.start();//平移mTranslationXAnim.start();mTranslationYAnim.start();setEnabled(false);mScaleXAnim.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationCancel(Animator animation) {super.onAnimationCancel(animation);setEnabled(true);}@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);setEnabled(true);setClickable(true);}@Overridepublic void onAnimationStart(Animator animation) {super.onAnimationStart(animation);}});}});}private void resetView() {setCardBackgroundColor(Color.TRANSPARENT);removeAllViews();startTick(false);}private void startTick(boolean start) {if (!start) {mHandler.removeCallbacksAndMessages(null);return;}mHandler.postDelayed(new Runnable() {@Overridepublic void run() {setVisibility(GONE);}}, 5 * 1000);}
}
GlideRoundTransform.java
package com.lyw.myproject.screenshot;import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;/*** Created on 2018/12/26.** @author lyw**/
public class GlideRoundTransform extends BitmapTransformation {private static float radius = 0f;/*** 构造函数 默认圆角半径 4dp** @param context Context*/public GlideRoundTransform(Context context) {this(context, 4);}/*** 构造函数** @param context Context* @param dp 圆角半径*/public GlideRoundTransform(Context context, int dp) {super(context);radius = Resources.getSystem().getDisplayMetrics().density * dp;}@Overrideprotected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {return roundCrop(pool, toTransform);}private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {if (source == null) {return null;}Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);if (result == null) {result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);}Canvas canvas = new Canvas(result);Paint paint = new Paint();paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));paint.setAntiAlias(true);RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());canvas.drawRoundRect(rectF, radius, radius, paint);return result;}@Overridepublic String getId() {return getClass().getName() + Math.round(radius);}
}
activity_screen_shot1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/pic_iv"android:layout_width="match_parent"android:layout_height="wrap_content"android:scaleType="fitXY"android:src="@mipmap/picture" /><com.lyw.myproject.widget.ScreenshotNotifyViewxmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/display_screenshot_snv"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="gone"app:cardBackgroundColor="@color/src_trans" /></FrameLayout><Buttonandroid:id="@+id/screen_btn"android:text="截图"android:layout_gravity="center"android:layout_marginTop="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>
ScreenShotActivity1.java
package com.lyw.myproject.screenshot;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;import com.lyw.myproject.BaseActivity;
import com.lyw.myproject.R;
import com.lyw.myproject.utils.LoadingLayout;
import com.lyw.myproject.utils.MemoryUtils;
import com.lyw.myproject.utils.PermissionUtil;
import com.lyw.myproject.widget.ScreenshotNotifyView;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;import androidx.annotation.Nullable;/*** 功能描述:截图*/
public class ScreenShotActivity1 extends BaseActivity {private ImageView picImg;private Button screenBtn;private ScreenshotNotifyView mDisplayScreenshotSnv;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_screen_shot1);initView();initEvent();}private void initView() {picImg = (ImageView) findViewById(R.id.pic_iv);mDisplayScreenshotSnv = (ScreenshotNotifyView) findViewById(R.id.display_screenshot_snv);screenBtn = (Button) findViewById(R.id.screen_btn);}private void initEvent() {screenBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {handleScreenShot();}});}/*** 处理截屏的业务*/private void handleScreenShot() {if (!PermissionUtil.isHasSDCardWritePermission(this)) {Toast.makeText(ScreenShotActivity1.this, "没有权限", Toast.LENGTH_SHORT).show();PermissionUtil.requestSDCardWrite(this);return;}if (!MemoryUtils.hasEnoughMemory(MemoryUtils.MIN_MEMORY)) {Toast.makeText(ScreenShotActivity1.this, "内存不足,截图失败", Toast.LENGTH_SHORT).show();return;}String filePath = getFilePath();mDisplayScreenshotSnv.setVisibility(View.GONE);mDisplayScreenshotSnv.setPath(filePath, picImg.getMeasuredWidth(), picImg.getMeasuredHeight(), true);mDisplayScreenshotSnv.setVisibility(View.VISIBLE);}private String getFilePath() {Bitmap bitmap = createViewBitmap(picImg);if (bitmap != null) {try {// 首先保存图片String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "HIS";File appDir = new File(storePath);if (!appDir.exists()) {appDir.mkdir();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);bos.flush();bos.close();Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);Uri uri = Uri.fromFile(file);intent.setData(uri);sendBroadcast(intent);return file.getAbsolutePath();} catch (Exception e) {return null;}} else {return null;}}public Bitmap createViewBitmap(View v) {Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);v.draw(canvas);return bitmap;}
}
PermissionUtil.java
package com.lyw.myproject.utils;import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.core.app.ActivityCompat;public class PermissionUtil {/*** 请求地理位置** @param context*/public static void requestLocationPermission(Context context) {if (Build.VERSION.SDK_INT >= 23) {if (!isHasLocationPermission(context)) {ActivityCompat.requestPermissions((Activity) context, PermissionManager.PERMISSION_LOCATION, PermissionManager.REQUEST_LOCATION);}}}/*** 判断是否有地理位置** @param context* @return*/public static boolean isHasLocationPermission(Context context) {return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;}/*** 判断是否有文件读写的权限** @param context* @return*/public static boolean isHasSDCardWritePermission(Context context) {return ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;}/*** 文件权限读写** @param context*/public static void requestSDCardWrite(Context context) {if (Build.VERSION.SDK_INT >= 23) {if (!isHasSDCardWritePermission(context)) {ActivityCompat.requestPermissions((Activity) context, PermissionManager.PERMISSION_SD_WRITE, PermissionManager.REQUEST_SD_WRITE);}}}
}
MemoryUtils.java
package com.lyw.myproject.utils;
import android.util.Log;
public class MemoryUtils {public static final int MIN_MEMORY = 50 * 1024 * 1024;/*** 判断有没足够内存截图** @param size* @return*/public static boolean hasEnoughMemory(int size) {//最大内存long maxMemory = Runtime.getRuntime().maxMemory();//分配的可用内存long freeMemory = Runtime.getRuntime().freeMemory();//已用内存long usedMemory = Runtime.getRuntime().totalMemory() - freeMemory;//剩下可使用的内存long canUseMemory = maxMemory - usedMemory;Log.d("Memory", "hasEnoughMemory: " +"maxMemory = " + maxMemory +", freeMemory = " + freeMemory +", usedMemory = " + usedMemory +", canUseMemory = " + canUseMemory);if (canUseMemory >= size) {return true;}return false;}
}
android实现截图并动画消失相关推荐
- android 新浪财经截屏分享,[图]Android 12截图曝光:启用全新UI 增强隐私保护功能...
原标题:[图]Android 12截图曝光:启用全新UI 增强隐私保护功能 来源:cnBeta.COM Android 12 有望在今年秋季上线,相关的开发者预览版和 Beta 版本有望在本月晚些时候 ...
- Android自定义底部带有动画的Dialog
Android自定义底部带有动画的Dialog 效果图 先看效果图,是不是你想要的呢 自定义Dialog package --.view;import android.app.Dialog; impo ...
- Android 图片Loading旋转动画效果
使用场景:在数据请求或者一些加载的页面中,总需要一些过度的动画效果,很多时候我们都可以在图片中间加一个loading的旋转图片,以前也做过,今天做的时候噼里啪啦敲了半天结果运行没效果,所以今天总结下这 ...
- android 折叠动画,Android:展开/折叠动画
Android:展开/折叠动画 假设我有一个垂直linearLayout: [v1] [v2] 默认情况下,v1具有visibily = GONE. 我想用扩展动画展示v1并同时向下推v2. 我试过这 ...
- Android Property Animation属性动画:scale缩放动画(4)
Android Property Animation属性动画:scale缩放动画(4) 和之前我写的附录文章1,2,3相似,本文将接着使用Android Property Animation属性 ...
- Android 图片的帧动画
Android之中有 Obj 动画 即 UI动画 和 Image的Fragment动画 ①Image动画 将一系列图片照顺序 排列 组成一个序列展示 XML文件存放路径: res/anim/filen ...
- Android开发之三种动画
转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...
- Android自定义水波纹动画Layout
Android自定义水波纹动画Layout 源码是双11的时候就写好了,但是我觉得当天发不太好,所以推迟了几天,没想到过了双11女友就变成了前女友,桑心.唉不说了,来看看代码吧. 展示效果 Hi前辈 ...
- android中设置Animation 动画效果
在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...
最新文章
- 使用Xpose突破安卓App禁止截屏限制
- 【正一专栏】登贝莱,该不该来!
- hiho #1044 : 状态压缩·一
- WebSocket + Spring消息推送服务的快速实现
- JavaScript函数 this调用规则
- spoj Favorite Dice(概率dp+期望)
- 人工智能能够构建一个自主驱动云吗?
- activity 、window与view的关系 (上)
- 本地mysql数据库初始密码_忘记本地MySQL数据库密码的解决方法
- 完成端口(IOCP)详解[1/2](转载)
- 3. Spring Boot 从零开始学习
- java拦截器和过滤器的区别_拦截器和过滤器的区别
- Java常用代码汇总(经典代码)
- 二工大计算机专业,二工大 上海第二工业大学 计算机专业英语 期末考试
- 解决手机WiFi(电脑热点)一直正在获取IP地址或无法访问互联网【与网上其他方法不同】
- 计算机提示无法访问手机tf卡,电脑(手机)无法读取内存卡(存储卡)的解决方法大全...
- easyui的filebox赋值回显
- 伊通一中2021高三高考成绩查询,吉林四平最好的4所高中,第1名一骑绝尘,看看有没有你的母校?...
- python剔除数据_python实现对excel进行数据剔除操作实例
- Vivado安装找不到matlab,vivado安装System Generator不支持新版Matlab怎么办?
热门文章
- python怎样控制继电器_【Linux】树莓派控制继电器(C、python手把手教学)
- 读取3D文件mesh格式工具
- 广州鞋材,温泽鞋材为你效劳
- 605. 种花问题(贪心算法)
- 对于Imbalance Data的总结
- keil5固件库版本的工程建立
- Android webView中监听物理返回键一层一层退出
- matlab legend 太大,[转载]MATLAB中调整legend的大小位置
- JavaScript的隔行变色和选项卡
- python教程输入_Python教程(2.5)——控制台输入