A. android中如何动态修改ImageView中图片的大小 比如说点击该图片后图片能变大
使用位图(Bitmap)再重新绘制遍
//原位图
Bitmap btm1 = BitmapFactory.decodeResource(Main.this.getResources(), R.drawable.hh);
BitmapDrawable bd1=BitmapDrawable(btm1);
imageView.setBackgroundDrawable(bd1);
放大后 滑动时计算 图片的边是否在屏幕外,如果在屏幕外就可移动,比如 向上滑动,是想看图片下面的部分,此时计算图片的底边是否在屏幕外,如果是,就可以向上移动图片。
Scaletype的设置的方式包括:
1、在layout xml中定义android:scaleType="CENTER"
2、或在代码中调用imageView.setScaleType(ImageView.ScaleType.CENTER);
(1)androidbitmap放大扩展阅读:
根据位深度,可将位图分为1、4、8、16、24及32位图像等。每个像素使用的信息位数越多,可用的颜色就越多,颜色表现就越逼真,相应的数据量越大。
例如,位深度为 1 的像素位图只有两个可能的值(黑色和白色),所以又称为二值位图。位深度为 8 的图像有 2^8(即 256)个可能的值。位深度为 8 的灰度模式图像有 256 个可能的灰色值。
RGB图像由三个颜色通道组成。8 位/通道的 RGB 图像中的每个通道有 256 个可能的值,这意味着该图像有 1600 万个以上可能的颜色值。
有时将带有 8 位/通道 (bpc) 的 RGB 图像称作 24 位图像(8 位 x 3 通道 = 24 位数据/像素)。通常将使用24位RGB组合数据位表示的的位图称为真彩色位图。
B. Android 编程 如何实现 文字放大效果 例如图片的放大和缩小的效果
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnTouchListener {
/** Called when the activity is first created. */
// 放大缩小
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
PointF start = new PointF();
PointF mid = new PointF();
float oldDist;
private ImageView myImageView;
// 模式
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myImageView = (ImageView) findViewById(R.id.myImage);
myImageView.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView myImageView = (ImageView) v;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 设置拖拉模式
case MotionEvent.ACTION_DOWN:
matrix.set(myImageView.getImageMatrix());
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
// 设置多点触摸模式
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
}
break;
// 若为DRAG模式,则点击移动图片
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x, event.getY()
- start.y);
}
// 若为ZOOM模式,则点击触摸缩放
else if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
// 设置硕放比例和图片的中点位置
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
myImageView.setImageMatrix(matrix);
return true;
}
// 计算移动距离
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
// 计算中点位置
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
}
C. android画一张图片,缩放显示并且放大不失真
这个问题涉及图片呈现的一整套方案。归纳而言这个问题是:给定任意尺寸的图片如何在任意尺寸分辨率的机器上显示?并且能够保持图片原来的清晰度。一般采用如下方案来解决这个问题:
1、首先给原图片创建一块内存缓存副本。如果不创建缓存的话,那么任何一次图片的剪切、缩放等操作都将丢失图片信息,使得保持原有图片的滋味那是不可能的。当然对于一般的程序而言,这个操作只需要调用简单的API即可完成。例如Android,只需要创建一个对应图片的Bitmap对象即可。
2、如果想要在设备显示的初始化状态图片即为满屏,那么必须调用相关API动态获得设备的分辨率。然后按设备分辨率的大小对图片进行剪切并显示到设备上。
注意:在获得图片分辨率后,如果分辨率大于图片,那不用说,直接显示图片就好。但是如果小于图片,此时有多种选择。可以将图片缩放至屏幕分辨率(图片纵横比可能失真)也可以选择剪切图片的一部分显示到屏幕上。
3、对图片进行缩放或者移动
我们在图片第一次显示的时候无论是选择缩放还是剪切,都要记录下图片被缩放的比例或者剪辑的范围。这样在用户再次移动或者缩放的时候,根据之前的缩放比例和移动坐标,计算当前应该移动的位置和缩放比例。并且根据计算结果对缓存的图片进行剪辑并显示到屏幕上。
其实整个过程可以概括为如下流程:
——>图片的初始缩放比例和显示起点坐标——>用户触发缩放或者移动操作——>计算新的图片缩放比例和显示起点坐标——>根据新的缩放比例和显示起点坐标剪辑缓存图片并绘制到屏幕上......
D. android bitmap 改变图片大小
Optionsoptions1=newOptions();
options1.inJustDecodeBounds=true;
BitmapFactory.decodeFile(filePath,options1);
options1.inSampleSize=RegisterTool.calculateInSampleSize(options1,110,160);//110,160:转换后的宽和高,具体值会有些出入
options1.inJustDecodeBounds=false;
Bitmapbitmap=BitmapFactory.decodeFile(filePath,options1);//filePath:文件路径
(BitmapFactory.Optionsoptions,
intreqWidth,intreqHeight){
finalintheight=options.outHeight;
finalintwidth=options.outWidth;
intinSampleSize=1;
if(height>reqHeight||width>reqWidth){
finalintheightRatio=Math.round((float)height
/(float)reqHeight);
finalintwidthRatio=Math.round((float)width/(float)reqWidth);
inSampleSize=heightRatio<widthRatio?widthRatio:heightRatio;
}
returninSampleSize;
}
//压缩图片并将Bitmap保存到本地
FileOutputStreamout=newFileOutputStream(newFile(filePath));
saveBitmap.compress(Bitmap.CompressFormat.JPEG,60,out);//60代表压缩40%
E. Android 图片加载(一)高效加载Bitmap 基础篇
由于Bitmap的特殊性以及Android对单个应用所规定的最大内存限制,我们在同时加载大量Bitmap时很容易发生内存溢出,即我们通常所说的OutOfMemoryError(OOM),因此高效加载Bitmap就成为了每个Android开发者的必备技能。
在学习如何高效地加载Bitmap之前,首先介绍一下如何加载一个Bitmap。我们都知道,Bitmap在Android中通常指的是一张图片,那么如何将JPG、PNG等格式的图片转换成Bitmap对象呢?BitmapFactory类给我们提供了一些方法:
接下来开始介绍如何高效地加载Bitmap,其实核心思想很简单: 就是采用BitmapFactory.Options参数来调整图片尺寸来适配控件的大小。
假如我们显示图片的控件ImageView宽高为100×100像素,而图片的尺寸为1024×1024像素,这个时候如果将整个图片加载进来并显示到控件上,自然是很占用内存资源的。这个时候可以通过BitmapFactory.Options按一定的采样率加载缩小后的图片,再将缩小后的图片显示到ImageView中,这样就能减小内存占用从而在一定程度上避免OOM的发生。
通过BitmapFactory.Options来缩放图片,主要是使用它的inSampleSize参数,也就是前面提到的采样率。当采样率inSampleSize为1时,采样后的图片大小为原图大小;当采样率inSampleSize>1,比如为2时,采样后的图片宽高都为原图的1/2,即像素降为原图的1/4,占用的内存大小也就是原图的1/4;比较特殊的是,当采样率inSampleSize<1时,系统会自动将该值当做1来处理。 因此可以得出一个结论:采样率inSampleSize必须是大于1的整数图片才会有缩小的效果,并且采样率同时作用于宽高,也就是说采样后的图片会缩小到原图的1/(inSampleSize^2)。比如inSampleSize=4,那么缩放比例为1/16。
我们现在知道了,通过采样率可以提高图片的加载效率,那么如何才能计算出最合适的采样率?我们可以按照如下流程:
接下来以decodeFile方法为例实现图片的缩放,其他三个方法处理方式类似。
下一篇: Android 图片加载(二)图片加载框架Glide 入门篇
《Android开发艺术探索》