
整体思路
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>() { @OverrIDe public boolean onException(Exception e, file model, Target<GlIDeDrawable> target, boolean isFirstResource) { if (anim) { anim(thumb, true); } return false; } @OverrIDe public 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() { @OverrIDe public 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() { @OverrIDe public voID onAnimationCancel(Animator animation) { super.onAnimationCancel(animation); setEnabled(true); } @OverrIDe public voID onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); setEnabled(true); setClickable(true); } @OverrIDe public 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); } @OverrIDe public voID setVisibility(int visibility) { super.setVisibility(visibility); if (visibility == GONE) { resetVIEw(); } } @OverrIDe protected 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() { @OverrIDe public 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>() { @OverrIDe public boolean onException(Exception e, file model, Target<GlIDeDrawable> target, boolean isFirstResource) { if (anim) { anim(thumb, true); } return false; } @OverrIDe public 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() { @OverrIDe public 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() { @OverrIDe public voID onAnimationCancel(Animator animation) { super.onAnimationCancel(animation); setEnabled(true); } @OverrIDe public voID onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); setEnabled(true); setClickable(true); } @OverrIDe public 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() { @OverrIDe public 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; } @OverrIDe protected 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; } @OverrIDe public 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"> <FrameLayout androID:layout_wIDth="match_parent" androID:layout_height="wrap_content"> <ImageVIEw androID: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.ScreenshotNotifyVIEw xmlns: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> <button androID: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; @OverrIDe protected 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() { @OverrIDe public 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实现截图并动画消失所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)