当前位置:   article > 正文

android将控件变成图片的并显示的实现方式_android 将控件转成图片

android 将控件转成图片

    工作记录:工作中有时需要将屏幕中的控件现实成图片并显示在屏幕上,比如在百度地图中自定义marker可能是一个带有进度条的图片,进度条随时更新进度,那就需要我们有这样的实现了。

这里记录两种实现方式:

布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <Button
  6. android:layout_width="match_parent"
  7. android:text="button"
  8. android:id="@+id/btn"
  9. android:layout_height="wrap_content" />
  10. <ImageView
  11. android:layout_width="match_parent"
  12. android:layout_height="100dp"
  13. android:id="@+id/image"
  14. android:layout_below="@id/btn"
  15. android:layout_centerHorizontal="true"
  16. android:background="@color/colorAccent"
  17. />
  18. </RelativeLayout>

java代码:

  1. package com.xuganwen.colorfullimage;
  2. import android.graphics.Bitmap;
  3. import android.graphics.BitmapFactory;
  4. import android.graphics.Canvas;
  5. import android.graphics.drawable.BitmapDrawable;
  6. import android.os.Bundle;
  7. import android.support.annotation.Nullable;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.view.View;
  10. import android.view.ViewTreeObserver;
  11. import android.widget.Button;
  12. import android.widget.ImageView;
  13. import com.xuganwen.colorfullphoto.R;
  14. public class FourthActivity extends AppCompatActivity {
  15. private Button btn;
  16. private ImageView image;
  17. @Override
  18. protected void onCreate(@Nullable Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.ac_fourth);
  21. btn=(Button)findViewById(R.id.btn);
  22. image=(ImageView)findViewById(R.id.image);
  23. }
  24. @Override
  25. protected void onResume() {
  26. super.onResume();
  27. btn.setOnClickListener(new View.OnClickListener() {
  28. @Override
  29. public void onClick(View v) {
  30. setImageBitmap();
  31. }
  32. });
  33. setImageBitmapOne();
  34. }
  35. /*
  36. * 方法二
  37. * */
  38. private void setImageBitmapOne() {
  39. btn.setDrawingCacheEnabled(true);
  40. btn.buildDrawingCache(true);
  41. ViewTreeObserver viewTreeObserver=btn.getViewTreeObserver();
  42. viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
  43. @Override
  44. public void onGlobalLayout() {
  45. btn.getViewTreeObserver().removeOnGlobalLayoutListener(this);
  46. Bitmap bitmap= Bitmap.createBitmap(btn.getMeasuredWidth(),btn.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
  47. Canvas canvas=new Canvas(bitmap);
  48. btn.draw(canvas);
  49. image.setImageBitmap(bitmap);
  50. }
  51. });
  52. }
  53. /*方法一
  54. * */
  55. private void setImageBitmap() {
  56. btn.setDrawingCacheEnabled(true);
  57. btn.buildDrawingCache(true);
  58. Bitmap bitmap=btn.getDrawingCache();
  59. image.setImageBitmap(bitmap);
  60. }
  61. }

注意:以上两种方法稍有不同,其实第二种方法是第一种方法的升级版,在第一中方法中,添加viewtreeobserver监听之后就可以不需要等到控件获取焦点(或者说界面完全绘制完成之后)才去获取到btn的长宽,可以直接在非交互代码中调用。

关于viewtreeobserver推荐一篇博客,想了解的可以去看看:viewtreeobserver的简单了解

 

引申:ScrollView的控件截屏:

  1. /**
  2. * 截取scrollview的屏幕
  3. * **/
  4. public static Bitmap getScrollViewBitmap(ScrollView scrollView) {
  5. int h = 0;
  6. Bitmap bitmap;
  7. for (int i = 0; i < scrollView.getChildCount(); i++) {
  8. h += scrollView.getChildAt(i).getHeight();
  9. }
  10. // 创建对应大小的bitmap
  11. bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
  12. Bitmap.Config.ARGB_8888);
  13. final Canvas canvas = new Canvas(bitmap);
  14. scrollView.draw(canvas);
  15. return bitmap;
  16. }

截屏获取屏幕截图:

  1. View dView = getWindow().getDecorView();
  2. dView.setDrawingCacheEnabled(true);
  3. dView.buildDrawingCache();
  4. Bitmap bitmap = Bitmap.createBitmap(dView.getDrawingCache());
  5. if (bitmap != null) {
  6. try {
  7. // 获取内置SD卡路径
  8. String sdCardPath = Environment.getExternalStorageDirectory().getPath();
  9. // 图片文件路径
  10. String filePath = sdCardPath + File.separator + "screenshot.png";
  11. File file = new File(filePath);
  12. FileOutputStream os = new FileOutputStream(file);
  13. bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
  14. os.flush();
  15. os.close();
  16. DebugLog.d("a7888", "存储完成");
  17. } catch (Exception e) {
  18. }
  19. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/261947?site
推荐阅读
相关标签
  

闽ICP备14008679号