Android ImageView以及实现截图

实现效果

截图前

在这里插入图片描述

截图后

在这里插入图片描述

代码

package cn.jj.huaweiad;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

import androidx.appcompat.app.AppCompatActivity;

import cn.jj.sdkcomtools.utils.LogUtils;

public class ImageViewActivity extends AppCompatActivity {
    private static final String TAG = "JJWorld.ImageViewActivity";

    private ImageView imageViewTest;
    private Button fitXYBtn;
    private Button fitStartBtn;
    private Button fitCenterBtn;
    private Button fitEndBtn;
    private Button centerBtn;
    private Button centerCropBtn;
    private Button centerInsideBtn;
    private Button mfitXYBtn;
    private Button layout;
    private ViewGroup rootView;
    private ViewGroup rootView1;
    private LinearLayout mRootLayout;
    private ImageView captureImageView;
    private Button captureBtn;
    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_view);
        rootView = (ViewGroup) findViewById(android.R.id.content);
        initView();
        imageViewTest.setImageResource(R.drawable.tk_huawei_ad_splash_slogan_portait);
        printAllViewsInLayout((ViewGroup) findViewById(android.R.id.content), 0);
        mHandler = new Handler();
        rootView.setDrawingCacheEnabled(true);
    }

    @SuppressLint("LongLogTag")
    private void printAllViewsInLayout(ViewGroup layout, int level) {
        int childCount = layout.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View childView = layout.getChildAt(i);
            Log.d(TAG, "View level:" + level + ", index " + i + ": " + childView.getClass().getSimpleName());

            // 如果子视图是ViewGroup,则递归地打印其子视图
            if (childView instanceof ViewGroup) {
                printAllViewsInLayout((ViewGroup) childView, level + 1);
            }
        }
    }

    private void initView() {
        imageViewTest = (ImageView) findViewById(R.id.image_view_test);
        fitXYBtn = (Button) findViewById(R.id.fitXY_btn);
        fitXYBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                imageViewTest.setScaleType(ImageView.ScaleType.FIT_XY);
            }
        });
        fitStartBtn = (Button) findViewById(R.id.fitStart_btn);
        fitStartBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                imageViewTest.setScaleType(ImageView.ScaleType.FIT_START);
            }
        });
        fitCenterBtn = (Button) findViewById(R.id.fitCenter_btn);
        fitCenterBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                imageViewTest.setScaleType(ImageView.ScaleType.FIT_CENTER);
            }
        });
        fitEndBtn = (Button) findViewById(R.id.fitEnd_btn);
        fitEndBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                imageViewTest.setScaleType(ImageView.ScaleType.FIT_END);
            }
        });
        centerBtn = (Button) findViewById(R.id.center_btn);
        centerBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                imageViewTest.setScaleType(ImageView.ScaleType.CENTER);
            }
        });
        centerCropBtn = (Button) findViewById(R.id.centerCrop_btn);
        centerCropBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                imageViewTest.setScaleType(ImageView.ScaleType.CENTER_CROP);
            }
        });
        centerInsideBtn = (Button) findViewById(R.id.centerInside_btn);
        centerInsideBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                imageViewTest.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
            }
        });
        layout = (Button) findViewById(R.id.layout);
        layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                rootView.removeAllViews();
                LogUtils.logI(TAG,"---------------------------");
                FrameLayout newRootView = new FrameLayout(ImageViewActivity.this);
                setContentView(newRootView);
                printAllViewsInLayout((ViewGroup) findViewById(android.R.id.content), 0);
            }
        });
        mRootLayout = (LinearLayout) findViewById(R.id.m_root_layout);
        captureImageView = (ImageView) findViewById(R.id.capture_image_view);
        captureBtn = (Button) findViewById(R.id.capture_btn);
        captureBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Bitmap bitmap = rootView.getDrawingCache();
                captureImageView.setImageBitmap(bitmap);
                mHandler.postDelayed(mRunnable,200);
            }
        });
    }

    private Runnable mRunnable = new Runnable(){

        @Override
        public void run() {
            rootView.setDrawingCacheEnabled(false);
            rootView.setDrawingCacheEnabled(true);
        }
    };
}

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/m_root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/image_view_test"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

    <ImageView
        android:id="@+id/capture_image_view"
        android:layout_width="match_parent"
        android:layout_height="200dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/fitXY_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fitXY" />

        <Button
            android:id="@+id/fitStart_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fitStart" />

        <Button
            android:id="@+id/fitCenter_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fitCenter" />

        <Button
            android:id="@+id/fitEnd_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fitEnd" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/center_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="center" />

        <Button
            android:id="@+id/centerCrop_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="centerCrop" />

        <Button
            android:id="@+id/centerInside_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="centerInside" />



    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="layout" />

        <Button
            android:id="@+id/capture_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="截图" />
    </LinearLayout>
</LinearLayout>

日志

应用启动,点击layout日志如下:

2024-03-28 20:54:08.051  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:0, index 0: LinearLayout
2024-03-28 20:54:08.051  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:1, index 0: AppCompatImageView
2024-03-28 20:54:08.051  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:1, index 1: AppCompatImageView
2024-03-28 20:54:08.051  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:1, index 2: LinearLayout
2024-03-28 20:54:08.051  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 0: MaterialButton
2024-03-28 20:54:08.051  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 1: MaterialButton
2024-03-28 20:54:08.051  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 2: MaterialButton
2024-03-28 20:54:08.051  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 3: MaterialButton
2024-03-28 20:54:08.052  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:1, index 3: LinearLayout
2024-03-28 20:54:08.052  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 0: MaterialButton
2024-03-28 20:54:08.052  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 1: MaterialButton
2024-03-28 20:54:08.052  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 2: MaterialButton
2024-03-28 20:54:08.052  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:1, index 4: LinearLayout
2024-03-28 20:54:08.052  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 0: MaterialButton
2024-03-28 20:54:08.052  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:2, index 1: MaterialButton
2024-03-28 20:54:14.092  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       I  ---------------------------
2024-03-28 20:54:14.093  3772-3772  JJWorld.Im...ewActivity cn.jj.huaweiad                       D  View level:0, index 0: FrameLayout

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

螺旋矩阵的算法刷题

螺旋矩阵的算法刷题 本文主要涉及螺旋矩阵的算法 包括三个题目分别是 59. 螺旋矩阵 II54. 螺旋矩阵 中等LCR 146. 螺旋遍历二维数组 文章目录 螺旋矩阵的算法刷题一 、螺旋矩阵简单1.1 实现一&#xff08;我认为这个方法更巧妙&#xff01;&#xff01;&#xff09;1.2 实现二&…

Redis入门到实战-第十七弹

Redis实战热身t-digest篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

2024最新华为OD机试试题库全 -【二叉树计算】- C卷

1. 🌈题目详情 1.1 ⚠️题目 给出一个二叉树如下图所示: 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。 1.2 �…

自养号测评,补单的五大关键要素

现在很多大卖都是自己管理几百个账号&#xff0c;交给服务商不是特别靠谱 第一 你不知道服务商账号质量怎么样 第二 账号一天下了多少你也不清楚&#xff0c;如果下了很多单万一封号被关联了怎么办 第三 你也不知道服务商用什么卡给你下单&#xff0c;用一些低汇率和黑卡下单…

运用开关量信号远程传输装置实现工厂智能化技改需要分几步走

DTD509H系列开关量信号无线传输器由一个无线信号发射终端和一个无线信号接收终端组成&#xff0c;也可以根据用户现场实现一点对多点或者多点对一点的无线控制。DTD509H系列开关量信号无线传输器可与PLC的IO端口、继电器、二次仪表、传感器等工业设备配套使用&#xff0c;运用无…

【前端Vue】社交信息头条项目完整笔记第2篇:二、登录注册,准备【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配,关于 , 配置文件,封装请求模块。十、用户关…

快速上手Spring Cloud 十四:璀璨物联网之路

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

Java项目:78 springboot学生宿舍管理系统的设计与开发

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色&#xff1a;管理员、宿管、学生 管理员管理宿管员&#xff0c;管理学生&#xff0c;修改密码&#xff0c;维护个人信息。 宿管员管理公寓…

iOS - Runtime-API

文章目录 iOS - Runtime-API1. Runtime应用1.1 字典转模型1.2 替换方法实现1.3 利用关联对象给分类添加属性1.4 利用消息转发机制&#xff0c;解决方法找不到的异常问题 2. Runtime-API2.1 Runtime API01 – 类2.1.1 动态创建一个类&#xff08;参数&#xff1a;父类&#xff0…

轻松赚钱,精彩生活:上班族副业赚钱新攻略大揭秘!

薪水总是捉襟见肘&#xff0c;每月账单总让人倍感压力。你是否曾在静谧的夜晚&#xff0c;躺在床上&#xff0c;思索如何为家庭多赚一分钱&#xff1f;其实&#xff0c;你并不孤单。在这个充满机遇与挑战的时代&#xff0c;越来越多的人开始寻找副业&#xff0c;以期望让生活更…

Appium设备交互API

设备交互API指的是操作设备系统中的一些固有功能&#xff0c;而非被测程序的功能&#xff0c;例如模拟来电&#xff0c;模拟发送短信&#xff0c;设置网络&#xff0c;切换横竖屏&#xff0c;APP操作&#xff0c;打开通知栏&#xff0c;录屏等。 模拟来电 make_gsm_call(phon…

八数码问题

八数码难题 题目描述 在 3 3 3\times 3 33 的棋盘上&#xff0c;摆有八个棋子&#xff0c;每个棋子上标有 1 1 1 至 8 8 8 的某一数字。棋盘中留有一个空格&#xff0c;空格用 0 0 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是&#xff1a;给出一种初始布局…

Java项目:79 springboot海滨体育馆管理系统的设计与实现

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 体育馆管理系统主要实现了管理员功能模块和学生功能模块两大部分 管理员功能模块&#xff1a; 管理员登录后可对系统进行全面管理操作&#…

内网穿透_ICMP_icmpsh

目录 一、ICMP协议详解 二、ICMP隧道 (一) 为什么会使用ICMP (二) 实验环境 (三) 操作流程 1. 下载icmpsh 2. 下载并安装依赖 3. 关闭本地icmp响应 4. 攻击机启动服务端开始监听 5. 靶机启动工具客户端 6. 攻击机接受到靶机传来的数据 三、郑重声明 一、ICMP协议详…

LeetCode_1.两数之和

一、题目描述 二、方法 1.方法1&#xff08;暴力枚举法&#xff09; 利用两个for循环&#xff0c;对数组进行逐一的遍历&#xff0c;直到找到两个数的和为目标值时返回这两个数的下标。以下为c实现的完整代码。 # include<iostream> using namespace std; #include<…

C语言分支循环语句详解

分支和循环语句是什么 在我们写程序的时候&#xff0c;总会遇到想一直循环执行某种语句的时候&#xff0c;这时候我们就要使用一种语句叫循环语句&#xff0c;或者带一些判断条件的语句&#xff0c;在C语言中提供了像这些的循环语句和分支语句 if else 语句 这是一种判断语句…

AcWing 800. 数组元素的目标和(哈希)

原题链接 哈希思路: 我们可以在输入 时把每个数存进哈希表里&#xff0c;对于每个输入的 b[i]看看 x−b[i]是否出现与哈希表即可。 图解 #include <iostream> #include <algorithm> #include <unordered_map> using namespace std;const int N 111111;in…

使用 Yoda 和 ClickHouse 进行实时欺诈检测

背景 Instacart 是北美领先的在线杂货公司,拥有数百万活跃的客户和购物者。在其平台上打击欺诈和滥用行为不仅对于维护一个值得信赖和安全的环境至关重要,也对保持Instacart的财务健康至关重要。在这篇文章中,将介绍了一个欺诈平台——Yoda,解释了为什么我们选择ClickHous…

Game Maker 更新|在 The Sandbox 使用烹饪模拟器!

我们很高兴向你介绍 Game Maker 的最新更新&#xff1a;烹饪模拟器模板&#xff01;让自己沉浸在令人兴奋的新游戏类型中&#xff0c;同时学习有趣的新机制。剖析和探索模板&#xff0c;考验你的开发技能&#xff01; 什么是烹饪模拟游戏&#xff1f; 近年来&#xff0c;随着《…

【JavaScript】数组 ② ( JavaScript 数组索引 | JavaScript 遍历数组 | 使用 for 循环遍历数组 )

文章目录 一、JavaScript 数组索引1、数组索引2、数组索引 - 代码示例 二、JavaScript 遍历数组1、使用 for 循环遍历数组2、使用 for 循环遍历数组 - 代码示例 一、JavaScript 数组索引 1、数组索引 在 JavaScript 中 , 数组 的 " 索引 " 又称为 " 下标 "…