Android Studio 修改 Bitmap 的宽高的方法

本文介绍了一种使用Matrix类进行图片缩放与适配的技术,通过计算目标宽度和高度的比例,对原始图片进行缩放,以适应不同的显示需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码

 private Bitmap getMyImg(Bitmap rootImg, int goalW, int goalH) {
   	 int rootW = rootImg.getWidth();
     int rootH = rootImg.getHeight();
     // graphics 包下的
     Matrix matrix = new Matrix();
     matrix.postScale(goalW * 1.0f / rootW, goalH * 1.0f / rootH);
     return Bitmap.createBitmap(rootImg, 0, 0, rootW, rootH, matrix, true);
 }

问题询问:hellolxb@yeah.net

<think>我们正在讨论Android开发中使用ConstraintLayout动态修改或替换图片的问题。用户希望了解如何在ConstraintLayout中动态替换图片。 根据Android开发知识,动态替换图片通常涉及修改ImageView的src属性。在ConstraintLayout中,布局约束与图片内容是独立的,因此替换图片不会影响布局约束(除非图片尺寸变化导致约束重新计算,但约束本身不变)。 步骤: 1. 在布局文件中,使用ConstraintLayout作为根布局,并放置一个ImageView,设置其id(例如imageView)。 2. 在代码中,通过findViewById获取ImageView的引用。 3. 使用setImageResource()、setImageDrawable()或setImageBitmap()等方法动态替换图片。 注意:如果新图片的尺寸与旧图片不同,可能需要调整scaleType或重新设置约束(通常不需要,因为ConstraintLayout的约束是基于控件边界而非内容)。 示例代码: 布局文件(activity_main.xml): ```xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/constraintLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:src="@drawable/old_image" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` 在Activity中(MainActivity.java): ```java public class MainActivity extends AppCompatActivity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); // 例如,点击按钮后替换图片 Button button = findViewById(R.id.button); button.setOnClickListener(v -> { // 方法1:使用资源ID imageView.setImageResource(R.drawable.new_image); // 方法2:使用Drawable // Drawable drawable = ContextCompat.getDrawable(this, R.drawable.new_image); // imageView.setImageDrawable(drawable); // 方法3:使用Bitmap(注意:避免在主线程加载大图) // Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.new_image); // imageView.setImageBitmap(bitmap); }); } } ``` 如果用户希望完全替换ImageView(而不是仅修改图片),则可以通过动态添加和移除视图来实现。但在大多数情况下,只需替换图片即可。 另外,如果用户需要根据不同的条件动态改变布局(不仅仅是图片),可能需要使用ConstraintSet来动态修改约束。但根据问题,只涉及替换图片,因此不需要修改约束。 因此,回答重点:使用ImageView的setImageXXX方法。 根据引用[^1]中提到的dependencies,我们使用了androidx.constraintlayout:constraintlayout,所以确保项目已添加此依赖。 生成相关问题: 1. 如何在ConstraintLayout中动态修改约束? 2. 如何通过代码在ConstraintLayout中添加新的ImageView? 3. 替换图片后如何保持约束不变? 4. 如何避免动态替换图片时出现内存泄漏?</think>### 在 Android Studio 中使用 ConstraintLayout 动态替换图片的方法 在 ConstraintLayout 中动态替换图片的核心是操作 `ImageView` 组件,以下是具体步骤: #### 方法 1:通过资源 ID 替换图片 ```kotlin // 获取 ImageView 引用 val imageView = findViewById<ImageView>(R.id.your_image_view_id) // 动态替换图片(使用 drawable 资源) imageView.setImageResource(R.drawable.new_image_name) // 或使用代码创建的 Drawable val newDrawable = ContextCompat.getDrawable(this, R.drawable.new_image_name) imageView.setImageDrawable(newDrawable) ``` #### 方法 2:通过 Bitmap 替换图片(适合网络图片) ```kotlin // 从网络/文件加载 Bitmap val newBitmap = BitmapFactory.decodeFile("/sdcard/new_image.jpg") // 动态替换 imageView.setImageBitmap(newBitmap) ``` #### 方法 3:完整替换 ImageView 组件 ```kotlin val constraintLayout = findViewById<ConstraintLayout>(R.id.parent_layout) val oldImageView = findViewById<ImageView>(R.id.old_image_view) // 创建新 ImageView val newImageView = ImageView(this).apply { id = R.id.new_image_view setImageResource(R.drawable.new_image) layoutParams = oldImageView.layoutParams // 继承布局参数 } // 替换组件 constraintLayout.removeView(oldImageView) constraintLayout.addView(newImageView) ``` #### 关键注意事项: 1. **布局约束继承** 新图片会自动继承原 ImageView 的约束条件(如居中对齐、边距等),无需重新设置约束[^1] 2. **内存优化** ```kotlin // 回收旧图片资源(如果是 Bitmap) oldImageView.drawable?.callback = null (oldImageView.drawable as? BitmapDrawable)?.bitmap?.recycle() ``` 3. **动态修改约束**(如需调整位置) ```kotlin val constraintSet = ConstraintSet() constraintSet.clone(constraintLayout) constraintSet.connect( R.id.new_image_view, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START ) constraintSet.applyTo(constraintLayout) ``` 4. **性能建议** - 大图加载使用 `Glide` 或 `Picasso` 库 - 频繁替换时考虑 `ViewStub` 延迟加载 - 动画过渡效果: ```kotlin val fadeOut = AlphaAnimation(1f, 0f).apply { duration = 300 } val fadeIn = AlphaAnimation(0f, 1f).apply { duration = 300 } oldImageView.startAnimation(fadeOut) newImageView.startAnimation(fadeIn) ``` #### 完整示例布局 ```xml <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/parent_layout" ...> <ImageView android:id="@+id/target_image" android:layout_width="200dp" android:layout_height="200dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:src="@drawable/old_image" /> <Button android:id="@+id/btn_change" android:text="更换图片" app:layout_constraintTop_toBottomOf="@id/target_image" .../> </androidx.constraintlayout.widget.ConstraintLayout> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值