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開發藝術探索》