图片动态操作,利用SeekBar控制属性示例,适配屏幕解决方案
需求为,让图片适配屏幕大小,并且可以用一个滑块来控制图片的旋转,用一个滑块来控制图片大小,核心语法思路,控制图片的大小,
核心语法为:mImageView.setLayoutParams(new LinearLayout.LayoutParams(newWidth,newHeight));
这句代码意思是,重新适配屏幕宽高,但是宽高是计算生成的,间接完成适配。适配方法如下:
但是这儿二个属性要提前配置,要求图片大不能超出屏幕,所以先计算屏幕大小,
private void setMaxValueForSeekBar1(){
DisplayMetrics dmDisplayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dmDisplayMetrics);
mSeekBar1.setMax(dmDisplayMetrics.widthPixels - MIN_WIDTH);
}
//这儿先配置滑块的最大数值
图片旋转的配置核心代码为:
Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.test1)).getBitmap();
Matrix matrix = new Matrix();
matrix.setRotate(i);
bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(), bitmap.getHeight(),matrix,true);
mImageView.setImageBitmap(bitmap);
完整代码如下:
第一配置 values 文件 string.xml文件如下
<resources>
<string name="app_name">My Application1</string>
<string name="image_width">图像宽度</string>
<string name="image_height">图像高度</string>
<string name="image_rotate">旋转度数</string>
<string name="init_rotate">初始角度</string>
</resources>
第二静态布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <ImageView
android:id="@+id/img"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:src="@drawable/test1"/> <TextView
android:id="@+id/content1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:layout_marginTop="10dp"
/> <SeekBar
android:id="@+id/sekkbar1"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <TextView
android:id="@+id/content2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/init_rotate"
/>
<SeekBar
android:id="@+id/sekkbar2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="360"/>
</LinearLayout>
第三逻辑代码如下
package com.example.myapplication1; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView; public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
private final static int MIN_WIDTH = 200;
private ImageView mImageView;
private TextView mTextView1;
private SeekBar mSeekBar1;
private TextView mTextView2;
private SeekBar mSeekBar2; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewByid();
setListners();
setMaxValueForSeekBar1();
}
private void findViewByid(){
mImageView = findViewById(R.id.img);
mTextView1 = findViewById(R.id.content1);
mTextView2 = findViewById(R.id.content2);
mSeekBar1 = findViewById(R.id.sekkbar1);
mSeekBar2 = findViewById(R.id.sekkbar2);
}
private void setListners(){
mSeekBar1.setOnSeekBarChangeListener(this);
mSeekBar2.setOnSeekBarChangeListener(this);
}
private void setMaxValueForSeekBar1(){
DisplayMetrics dmDisplayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dmDisplayMetrics);
mSeekBar1.setMax(dmDisplayMetrics.widthPixels - MIN_WIDTH);
} @Override
// 当滑块被拖动时会执行以下代码
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
if(seekBar.getId() == R.id.sekkbar1){
int newWidth = i + MIN_WIDTH;
int newHeight = (int)(newWidth*3/4);
mImageView.setLayoutParams(new LinearLayout.LayoutParams(newWidth,newHeight));
mTextView1.setText(getResources().getString(R.string.image_width) +
newWidth+getResources().getString(R.string.image_height)+newHeight );
}else if(seekBar.getId() == R.id.sekkbar2){
Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.test1)).getBitmap();
Matrix matrix = new Matrix();
matrix.setRotate(i);
bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(), bitmap.getHeight(),matrix,true);
mImageView.setImageBitmap(bitmap);
mTextView2.setText(getResources().getString(R.string.image_rotate)+i); }
} @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onStopTrackingTouch(SeekBar seekBar) { }
}
第四屏幕截图,文件结构截图
图片动态操作,利用SeekBar控制属性示例,适配屏幕解决方案的更多相关文章
- jQuery .attr()和.removeAttr()方法操作元素属性示例
今天主要和大家一起分享一下如何使用jQuery的.attr()和.removeAttr()方法读取,添加,修改,删除元素的属性.大家在平时的Web页面制作中都有碰到如何动态的获取元素的属性和属性值,或 ...
- .net学习笔记----利用System.Drawing.Image类进行图片相关操作
C#中对图片的操作主要是通过System.Drawing.Image等类进行. 一.将图片转换为字节流 /// <summary> /// 图片处理帮助类 /// </summary ...
- 基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作
在很多场合,我们需要在线编辑HTML内容,然后在页面上或者其他终端上(如小程序.APP应用等)显示,编辑HTML内容的插件有很多,本篇介绍基于Bootstrap的 summernote插件实现HTML ...
- javascript里面的数组,json对象,动态添加,修改,删除示例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- !!!css如何让img图片居中?css的display属性实现图片居中(代码实例)
在我们开发前端页面的时候,为了让页面效果美观,会让图片呈现居中效果.那么css怎么让img图片居中显示呢?本篇文章给大家带来css如何让img图片居中?css的display属性实现图片居中(代码实例 ...
- [Java-基础]反射_Class对象_动态操作
动态性 动态语言 在程序运行时,可以改变程序结构或变量类型,典型的语言: Python,ruby,javascript 如: function test(){ var s = "var a= ...
- IE7中使用Jquery动态操作name问题
问题:IE7中无法使用Jquery动态操作页面元素的name属性. 在项目中有出现问题,某些客户的机器偶尔会有,后台取不到前台的数据值. 然开发和测试环境总是不能重现问题.坑爹之处就在于此,不能重现就 ...
- MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作
一.getMapper()接口 解析:getMapper()接口 IDept.class定义一个接口, 挂载一个没有实现的方法,特殊之处,借楼任何方法,必须和小配置中id属性是一致的 通过代理:生成接 ...
- javacpp-opencv图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制,文字和图片双水印
欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...
- Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
随机推荐
- windbg-windows调试工具来抓端游crash dump
windbg下载有两种方式: Install WinDbg - Windows drivers | Microsoft Learn 从微软应用商店下载 dump上的windows的局部变量解析部分进行 ...
- C/C++ 获取自身IP与域名片段
判断大端序小端序: 通常情况下,数值在内存中存储的方式有两种,一种是大尾字节序,另一种是小尾,比如0x01020304这样一个数值,如果用大尾方式存储,其存储方式为01 02 03 04而用小尾方式存 ...
- List对象按属性排序
1.Stream流sorted 正序: List<Person> collect = personList.stream().sorted(Comparator.comparing(Per ...
- SSD数据不能恢复?或许还有的救
我们经常说机械硬盘相对于固态硬盘的一个优势是数据可以恢复,难道SSD固态硬盘的数据就不能恢复了吗? 这里先简单介绍一下SSD的工作方式,SSD中的数据是以电子的形式通过浮栅保存的,写入就是通过增加电压 ...
- WPF性能优化:形状(Shape)、几何图形(Geometry)和图画(Drawing)的使用
在用户界面技术中,绘图是一个绕不开的话题.WPF提供了多种可根据应用程序要求进行优化的2D图形和图像的处理功能,包括画刷(Brush).形状(Shape).几何图形(Geometry).图画(Draw ...
- .NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(下)
接下来介绍使用代理方法的方式,也就是说把 ErrorController 整段逻辑直接定义在注册的地方,使用一个匿名委托来处理,这里的逻辑与之前的逻辑是相同的 app.UseExceptionHand ...
- RDS for MySQL并发性能测试
最近由于工作需要,需要对阿里云数据库-RDS for MySQL进行性能测试,通过MySQL自带的mysqlslap工具可以进行并发性能测试,但是输出显示总感觉有问题,所以就萌生想法自己开发代码通过J ...
- Java基础(一周汇总8.3--8.7)
Java基础: 声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 基础概念: 注释 "//" 这是单行注释文字 /* 这是多行注释文字 这是多行 ...
- 【架构师视角系列】QConfig配置中心系列之架构设计(一)
目录 声明 配置中心系列文章 一.架构 基础模型 架构图 架构分层 运行规则 模块划分 Admin模块 Client模块 Server模块 二.总结 三.最后 声明 原创文章,转载请标注.https: ...
- JS leetcode 两个数组的交集I II 合集题解分析
壹 ❀ 引 前些日子,在与博客园用户MrSmileZhu闲聊中,我问到了他先前在字节跳动面试中遇到了哪些算法题(又戳到了他的伤心处),因为当时面试的高度紧张,原题描述已经无法重现了,但大概与数组合并. ...