哪里有网站推广软件,免费推广seo策略方法,睢宁建设局网站,网站建设哪家好首选万维科技Android 截图功能实现 简介效果图功能实现1. 截取当前可见范围屏幕2. 截取当前可见范围屏幕#xff08;不包含状态栏#xff09;3. 截取某个控件4. 截取ScrollView5. 长截图6. 截屏动画效果7. 显示截屏结果#xff0c;自动消失6. 完整代码 简介
在Android应用中开发截图功能… Android 截图功能实现 简介效果图功能实现1. 截取当前可见范围屏幕2. 截取当前可见范围屏幕不包含状态栏3. 截取某个控件4. 截取ScrollView5. 长截图6. 截屏动画效果7. 显示截屏结果自动消失6. 完整代码 简介
在Android应用中开发截图功能涉及到以下几个步骤获取屏幕内容、处理截图、保存截图等。
效果图 功能实现
1. 截取当前可见范围屏幕
/*** 截取当前可见范围屏幕*/
private void screenCapture() {
// View decorView getWindow().getDecorView();
// decorView.setDrawingCacheEnabled(true);// 清空缓存可用于实时截图
// decorView.buildDrawingCache();
// Bitmap screenBitmap Bitmap.createBitmap(decorView.getDrawingCache());
// decorView.setDrawingCacheEnabled(false); // 清空缓存可用于实时截图View decorView getWindow().getDecorView();Bitmap screenBitmap Bitmap.createBitmap(decorView.getWidth(), decorView.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas new Canvas(screenBitmap);decorView.draw(canvas);updateImageCapture(screenBitmap);
}2. 截取当前可见范围屏幕不包含状态栏
/*** 截取当前可见范围屏幕不包含状态栏*/
private void screenCaptureNoStatusBar() {View view getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();// 获取状态栏高度Rect rect new Rect();view.getWindowVisibleDisplayFrame(rect);int statusBarH rect.top;// 获取屏幕宽高int w view.getWidth();int h view.getHeight();// 去掉状态栏Bitmap bitmap Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarH, w, h - statusBarH);// 销毁缓存信息view.destroyDrawingCache();updateImageCapture(bitmap);
}3. 截取某个控件
/*** 截取某个控件* param view*/
private void screenCapture(View view) {Bitmap screenBitmap Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);Canvas canvas new Canvas(screenBitmap);view.draw(canvas);updateImageCapture(screenBitmap);
}4. 截取ScrollView
/*** 截取ScrollView* param view*/
private void screenCapture(ScrollView view) {int h 0;for (int i 0; i view.getChildCount(); i) {h view.getChildAt(i).getHeight();view.getChildAt(i).setBackgroundColor(Color.parseColor(#FFFFFF));}Bitmap screenBitmap Bitmap.createBitmap(view.getMeasuredWidth(), h, Bitmap.Config.ARGB_8888);Canvas canvas new Canvas(screenBitmap);view.draw(canvas);updateImageCapture(screenBitmap);
}5. 长截图
/*** 滚屏截长图*/
private Runnable scrollRunnable new Runnable() {SuppressLint(NewApi)Overridepublic void run() {boolean isToBottom isScrollToEnd();if (isToBottom) {Log.i(TAG, run: to bottom);Thread.currentThread().interrupt();mHandler.removeCallbacks(scrollRunnable);screenCapture(scrollView);} else {// 未滑动到底部int off linearLayout.getMeasuredHeight() - scrollView.getHeight(); // 判断高度if (off 0) {scrollView.scrollBy(0, 6);if (scrollView.getScaleY() off) {Thread.currentThread().interrupt();mHandler.removeCallbacks(scrollRunnable);} else {mHandler.postDelayed(this, 10);}}}}
};6. 截屏动画效果
截屏时有一个缩放的动画效果缩放到右上角。
动画效果文件/res/anim/scale_animation.xml文件。
?xml version1.0 encodingutf-8?
set xmlns:androidhttp://schemas.android.com/apk/res/androidscaleandroid:duration500android:fromXScale1.0android:fromYScale1.0android:pivotX90%android:pivotY15%android:toXScale0.35android:toYScale0.35/alphaandroid:duration200android:fromAlpha0.5android:toAlpha1.0//set代码中使用动画效果
mCardView.startAnimation(animation);7. 显示截屏结果自动消失
截屏完成会将截取的图片显示在界面中显示截屏3s后会自动消失。
/*** 显示截图3s后自动消失*/
private Runnable captureViewRunnable new Runnable() {SuppressLint(NewApi)Overridepublic void run() {mCardView.clearAnimation();mCardView.setVisibility(View.INVISIBLE);}
};6. 完整代码
布局文件activity_screenshot.xml。
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.ScreenshotActivityButtonandroid:idid/btn_screenshotandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginStart60dpandroid:text截图app:layout_constraintTop_toTopOfparentapp:layout_constraintStart_toStartOfparent/Buttonandroid:idid/bnt_longandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text长截图android:layout_marginStart20dpapp:layout_constraintStart_toEndOfid/btn_screenshotapp:layout_constraintTop_toTopOfid/btn_screenshotapp:layout_constraintBottom_toBottomOfid/btn_screenshot/ScrollViewandroid:idid/scroll_viewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentapp:layout_constraintTop_toBottomOfid/btn_screenshotLinearLayoutandroid:idid/linear_layoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationvertical//ScrollViewandroidx.cardview.widget.CardViewandroid:idid/cardViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:backgroundandroid:color/transparentapp:contentPadding3dpapp:cardCornerRadius15dpapp:cardElevation20dpapp:cardPreventCornerOverlaptrueapp:cardUseCompatPaddingtrueandroid:visibilityinvisibleapp:layout_constraintTop_toTopOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentImageViewandroid:idid/iv_captureandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentapp:layout_constraintBottom_toBottomOfparent//androidx.cardview.widget.CardView/androidx.constraintlayout.widget.ConstraintLayoutActivity文件ScreenshotActivity.java。
public class ScreenshotActivity extends AppCompatActivity {private static final String TAG ScreenshotActivity;private ScrollView scrollView;private LinearLayout linearLayout;private ImageView ivScreenshots;private CardView mCardView;private Handler mHandler new Handler();// 截图动画private Animation animation;// 截图显示的时间超时后消失private static final int CAPTURE_SHOW_TIMEOUT 3000;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_screenshot);scrollView findViewById(R.id.scroll_view);linearLayout findViewById(R.id.linear_layout);ivScreenshots findViewById(R.id.iv_capture);mCardView findViewById(R.id.cardView);Button btnScreenshots findViewById(R.id.btn_screenshot);Button btnLong findViewById(R.id.bnt_long);animation AnimationUtils.loadAnimation(this, R.anim.scale_animation);animation.setFillAfter(true);// 动态添加textviewfor (int i 0; i 50; i) {TextView textView new TextView(this);textView.setText(item- (i 1));textView.setGravity(Gravity.CENTER);textView.setTextSize(16);linearLayout.addView(textView);}btnScreenshots.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {
// screenCapture();
// screenCapture(scrollView);screenCapture(scrollView);
// screenCaptureNoStatusBar();}});btnLong.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {mHandler.post(scrollRunnable);}});animation.setAnimationListener(new Animation.AnimationListener() {Overridepublic void onAnimationStart(Animation animation) {}Overridepublic void onAnimationEnd(Animation animation) {mHandler.postDelayed(captureViewRunnable, CAPTURE_SHOW_TIMEOUT);}Overridepublic void onAnimationRepeat(Animation animation) {}});}Overrideprotected void onPause() {super.onPause();mHandler.removeCallbacks(scrollRunnable);mHandler.removeCallbacks(captureViewRunnable);}/*** 滚屏的线程*/private Runnable scrollRunnable new Runnable() {SuppressLint(NewApi)Overridepublic void run() {boolean isToBottom isScrollToEnd();if (isToBottom) {Log.i(TAG, run: to bottom);Thread.currentThread().interrupt();mHandler.removeCallbacks(scrollRunnable);screenCapture(scrollView);} else {// 未滑动到底部int off linearLayout.getMeasuredHeight() - scrollView.getHeight(); // 判断高度if (off 0) {scrollView.scrollBy(0, 6);if (scrollView.getScaleY() off) {Thread.currentThread().interrupt();mHandler.removeCallbacks(scrollRunnable);} else {mHandler.postDelayed(this, 10);}}}}};/*** 显示截图3s后自动消失*/private Runnable captureViewRunnable new Runnable() {SuppressLint(NewApi)Overridepublic void run() {mCardView.clearAnimation();mCardView.setVisibility(View.INVISIBLE);}};/*** 截取当前可见范围屏幕*/private void screenCapture() {
// View decorView getWindow().getDecorView();
// decorView.setDrawingCacheEnabled(true);// 清空缓存可用于实时截图
// decorView.buildDrawingCache();
// Bitmap screenBitmap Bitmap.createBitmap(decorView.getDrawingCache());
// decorView.setDrawingCacheEnabled(false); // 清空缓存可用于实时截图View decorView getWindow().getDecorView();Bitmap screenBitmap Bitmap.createBitmap(decorView.getWidth(), decorView.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas new Canvas(screenBitmap);decorView.draw(canvas);updateImageCapture(screenBitmap);}/*** 截取某个控件* param view*/private void screenCapture(View view) {Bitmap screenBitmap Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);Canvas canvas new Canvas(screenBitmap);view.draw(canvas);updateImageCapture(screenBitmap);}/*** 截取ScrollView* param view*/private void screenCapture(ScrollView view) {int h 0;for (int i 0; i view.getChildCount(); i) {h view.getChildAt(i).getHeight();view.getChildAt(i).setBackgroundColor(Color.parseColor(#FFFFFF));}Bitmap screenBitmap Bitmap.createBitmap(view.getMeasuredWidth(), h, Bitmap.Config.ARGB_8888);Canvas canvas new Canvas(screenBitmap);view.draw(canvas);updateImageCapture(screenBitmap);}/*** 截取当前可见范围屏幕不包含状态栏*/private void screenCaptureNoStatusBar() {View view getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();// 获取状态栏高度Rect rect new Rect();view.getWindowVisibleDisplayFrame(rect);int statusBarH rect.top;// 获取屏幕宽高int w view.getWidth();int h view.getHeight();// 去掉状态栏Bitmap bitmap Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarH, w, h - statusBarH);// 销毁缓存信息view.destroyDrawingCache();updateImageCapture(bitmap);}private void updateImageCapture(final Bitmap screenBitmap) {runOnUiThread(new Runnable() {Overridepublic void run() {mCardView.setVisibility(View.VISIBLE);ivScreenshots.setImageBitmap(screenBitmap);}});mCardView.startAnimation(animation);}/*** scrollview是否已经滑到底部* return*/private boolean isScrollToEnd() {// 获取 ScrollView 的可视高度int visibleHeight scrollView.getHeight() - scrollView.getPaddingTop() - scrollView.getPaddingBottom();// 获取 ScrollView 的子ViewView lastChild scrollView.getChildAt(scrollView.getChildCount() - 1);// 获取 ScrollView 可以滑动的范围int scrollRange scrollView.getChildAt(0).getHeight() - scrollView.getHeight();// 获取 ScrollView 的滚动位置int scrollY scrollView.getScrollY();// 计算ScrollView底部位置int scrollViewBottom scrollY visibleHeight;// 获取ScrollView的子View的底部位置int lastChildBottom lastChild.getBottom();// 判断 ScrollView 是否滚动到底部if (scrollY scrollRange) {// 已滑动到底部return true;} else if (scrollViewBottom lastChildBottom) {// scrollTo 和 scrollTo 不是同时回调所以添加两个逻辑都可可根据需要决定是否需要使用两个逻辑组合// 已滑动到底部return true;} else {return false;}}}截图动画文件scale_animation.xml。
?xml version1.0 encodingutf-8?
set xmlns:androidhttp://schemas.android.com/apk/res/androidscaleandroid:duration500android:fromXScale1.0android:fromYScale1.0android:pivotX90%android:pivotY15%android:toXScale0.35android:toYScale0.35/alphaandroid:duration200android:fromAlpha0.5android:toAlpha1.0//set