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;@Overrideprotected 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() {@Overridepublic void onClick(View view) {imageViewTest.setScaleType(ImageView.ScaleType.FIT_XY);}});fitStartBtn = (Button) findViewById(R.id.fitStart_btn);fitStartBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {imageViewTest.setScaleType(ImageView.ScaleType.FIT_START);}});fitCenterBtn = (Button) findViewById(R.id.fitCenter_btn);fitCenterBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {imageViewTest.setScaleType(ImageView.ScaleType.FIT_CENTER);}});fitEndBtn = (Button) findViewById(R.id.fitEnd_btn);fitEndBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {imageViewTest.setScaleType(ImageView.ScaleType.FIT_END);}});centerBtn = (Button) findViewById(R.id.center_btn);centerBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {imageViewTest.setScaleType(ImageView.ScaleType.CENTER);}});centerCropBtn = (Button) findViewById(R.id.centerCrop_btn);centerCropBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {imageViewTest.setScaleType(ImageView.ScaleType.CENTER_CROP);}});centerInsideBtn = (Button) findViewById(R.id.centerInside_btn);centerInsideBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {imageViewTest.setScaleType(ImageView.ScaleType.CENTER_INSIDE);}});layout = (Button) findViewById(R.id.layout);layout.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(View view) {Bitmap bitmap = rootView.getDrawingCache();captureImageView.setImageBitmap(bitmap);mHandler.postDelayed(mRunnable,200);}});}private Runnable mRunnable = new Runnable(){@Overridepublic 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"><ImageViewandroid:id="@+id/image_view_test"android:layout_width="match_parent"android:layout_height="300dp" /><ImageViewandroid:id="@+id/capture_image_view"android:layout_width="match_parent"android:layout_height="200dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/fitXY_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="fitXY" /><Buttonandroid:id="@+id/fitStart_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="fitStart" /><Buttonandroid:id="@+id/fitCenter_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="fitCenter" /><Buttonandroid:id="@+id/fitEnd_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="fitEnd" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/center_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="center" /><Buttonandroid:id="@+id/centerCrop_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="centerCrop" /><Buttonandroid:id="@+id/centerInside_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="centerInside" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="layout" /><Buttonandroid: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相关文章:
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.ViewGro…...
剑指offer--数组中重复的数字
一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…...
【THM】SQL Injection(SQL注入)-初级渗透测试
简介 SQL(结构化查询语言)注入,通常称为 SQLi,是对 Web 应用程序数据库服务器的攻击,导致执行恶意查询。当 Web 应用程序使用未经正确验证的用户输入与数据库进行通信时,攻击者有可能窃取、删除或更改私人数据和客户数据,并攻击 Web 应用程序身份验证方法以获取私有数据…...
数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)
本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…...
vue3性能提升主要通过哪几方面?
📝个人主页:爱吃炫迈 💌系列专栏:Vue 🧑💻座右铭:道阻且长,行则将至💗 文章目录 编译优化diff算法优化提取动态节点 静态提升预字符串化缓存内联事件处理函数SSR优化 源…...
跨境电商IP防关联是什么?有什么作用?
做跨境电商的朋友应该都知道IP防关联这个词,那么为何IP需要防关联呢?今天为大家来解答这个问题。 跨境电商IP防关联是指在跨境电商运营中,通过采取一系列技术手段,确保每个跨境电商账号使用独立的IP地址,以避免账号之间因为IP地址…...
git仓库太大只下载单个文件或文件夹
有没有这样的苦恼:仓库太大,只想下载其中某些文件(夹)? 一招解决: ./down_folder_from_git.sh https://github.com/facebook/infer main Makefile FILES.md scripts examples ./down_folder_from_git.sh https://github.com/Ten…...
OpenHarmony实战:RK3568 开发板镜像烧录指南
前言 烧录开发板是每个开发者的必修课,每次对系统的修改务必进行烧录测试,确保修改正确和不会引入新问题。 本文基于 Windows10,以 RK3568 开发板为例,指导如何烧录 OpenHarmony 镜像,镜像也叫固件。Hihoopÿ…...
Asp.net Core 中一键注入接口
Asp.net Core 中一键注入接口 前言准备开始使用 前言 在之前开发Asp.Net Core程序时遇到接口需要一个一个的注入到Services中,当有非常多的接口需要注入时会显得代码成为了一座山,这里记录一下如何通过接口的命名一键自动注入. 准备 IDE: Visual studio 2022 .Net版本:.Net …...
怎么让ChatGPT批量写作原创文章
随着人工智能技术的不断发展,自然语言处理模型在文本生成领域的应用也日益广泛。ChatGPT作为其中的佼佼者之一,凭借其强大的文本生成能力和智能对话特性,为用户提供了一种高效、便捷的批量产出内容的解决方案。以下将就ChatGPT批量写作内容进…...
【SqlServer】Alwayson收缩日志
Alwayson收缩日志 压缩失败直接压缩压缩失败 直接压缩 加入高可用组之后,不能设置成简单模式。 USE [databasename] CHECKPOINT DECLARE @bakfile nvarchar(100) SET @bakfile=D:\data...
视觉里程计之对极几何
视觉里程计之对极几何 前言 上一个章节介绍了视觉里程计关于特征点的一些内容,相信大家对视觉里程计关于特征的描述已经有了一定的认识。本章节给大家介绍视觉里程计另外一个概念,对极几何。 对极几何 对极几何是立体视觉中的几何关系,描…...
数据可视化高级技术(Echarts)
目录 (一)数据可视化概念及Echarts基础知识 数据可视化的好处: 数据可视化的目标 数据可视化的基本流程 (二)数据图表 类别比较图表: 数据关系图表: 数据分布图表: 时间序列…...
设计模式——行为型——责任链模式Chain Of Responsibility
请求类 public class ApproverRequest {private int type;//请求批准的类型private float price;//请求的金额private int id;//请求的编号 } 审批人抽象类 public abstract class ApproverPerson {protected ApproverPerson next;protected String name;//审批过程public a…...
设计模式之工厂方法模式精讲
工厂方法模式又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中。 工厂模式可以分为简单工厂…...
JS实现省市区三级联动(json假数据)
省市级三级联动通常指的是在用户界面上,用户可以通过选择省份,然后基于所选择的省份选择对应的城市,最后基于所选择的城市选择对应的区县。这种联动效果在很多应用中都有出现,例如电商平台的收货地址选择、政务服务的地区选择等。…...
Fastjson配置消息转换器(时间格式问题)
问题: 我们可以看见,日期的格式有点问题。 由于ArticleListVO类的createTime成员变量是Date类型,默认是由java的Jackson来处理,使用 ISO-8601 规范来处理日期时间格式。ISO-8601 是一种国际标准的日期时间表示法,例如&…...
安卓Android 架构模式及UI布局设计
文章目录 一、Android UI 简介1.1 在手机UI设计中,坚持的原则是什么1.2 安卓中的架构模式1.2.1 MVC (Model-View-Controller)设计模式优缺点 1.2.2 MVP(Model-View-Presenter)设计模式MVP与MVC关系: 1.2.3 MVVM(Model—View—ViewModel ) 设计模式1.2.4 …...
基于Spring Boot的在线学习系统的设计与实现
基于Spring Boot的在线学习系统的设计与实现 摘 要 在线学习系统是以大学传统线下教学方式不适应信息技术的迅速发展为背景,提高学习效率,解决传统教学问题,并且高效的实现教学信息化的一款软件系统。为了更好的实现对于教学和学生的管理&a…...
C++中重载和重写的区别
重载 是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。 #include<bits/stdc.h>using namespace std;cl…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
