android imageview 筆記

android學習筆記34--------------有用代碼集(不斷更新)

5人收藏此文章, 我要收藏發表於3個月前 , 已有 758次閱讀 共 0個評論

轉載請註明原文出處:奔跑的蝸牛(袁方的技術博客)點擊打開連接
java

1、當利用textview顯示內容時,顯示內容過多可能會折行或顯示不全,那樣效果很很差。今天發現android api中已經給出自動省略的功能。android

實現以下:數據庫

  1. <TextView
  2. android:layout_width="fill_parent"
  3. android:layout_height="wrap_content"
  4. android:id="@+id/hello"
  5. android:ellipsize="end"
  6. android:singleLine="true"
  7. />
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/hello" 
    android:ellipsize="end" 
   android:singleLine="true" 
/>

2、學習]ImageView的scaletype屬性

ImageView的屬性android:scaleType,即 ImageView.setScaleType(ImageView.ScaleType)。android:scaleType是控制圖片如何 resized/moved來匹對ImageView的size。ImageView.ScaleType / android:scaleType值的意義區別:canvas


  1. CENTER /center 按圖片的原來size居中顯示,當圖片長/寬超過View的長/寬,則截 取圖片的居中部分顯示
  2. CENTER_CROP / centerCrop 按比例擴大圖片的size居中顯示,使得圖片長 (寬)等於或大於View的長(寬)
  3. CENTER_INSIDE / centerInside 將圖片的內容完整居中顯示,經過按比例縮小 或原來的size使得圖片長/寬等於或小於View的長/寬
  4. FIT_CENTER / fitCenter 把圖片按比例擴大/縮小到View的寬度,居中顯示
  5. FIT_END / fitEnd 把 圖片按比例擴大/縮小到View的寬度,顯示在View的下部分位置
  6. FIT_START / fitStart 把 圖片按比例擴大/縮小到View的寬度,顯示在View的上部分位置
  7. FIT_XY / fitXY 把圖片 不按比例 擴大/縮小到View的大小顯示
  8. MATRIX / matrix 用矩陣來繪製
CENTER /center 按圖片的原來size居中顯示,當圖片長/寬超過View的長/寬,則截 取圖片的居中部分顯示

CENTER_CROP / centerCrop 按比例擴大圖片的size居中顯示,使得圖片長 (寬)等於或大於View的長(寬)

CENTER_INSIDE / centerInside 將圖片的內容完整居中顯示,經過按比例縮小 或原來的size使得圖片長/寬等於或小於View的長/寬

FIT_CENTER / fitCenter 把圖片按比例擴大/縮小到View的寬度,居中顯示

FIT_END / fitEnd 把 圖片按比例擴大/縮小到View的寬度,顯示在View的下部分位置

FIT_START / fitStart 把 圖片按比例擴大/縮小到View的寬度,顯示在View的上部分位置

FIT_XY / fitXY 把圖片 不按比例 擴大/縮小到View的大小顯示

MATRIX / matrix 用矩陣來繪製



3、Uri與String之間的轉換

Uri u = Uri.parse( "content://media/internal/audio/media/81" );


Android 經過Uri獲取Bitmap對象
api

  1. private Bitmap getBitmapFromUri(Uri uri)
  2. {
  3. try
  4. {
  5. // 讀取uri所在的圖片
  6. Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
  7. return bitmap;
  8. }
  9. catch (Exception e)
  10. {
  11. Log.e("[Android]", e.getMessage());
  12. Log.e("[Android]", "目錄爲:" + uri);
  13. e.printStackTrace();
  14. return null;
  15. }
  16. }
private Bitmap getBitmapFromUri(Uri uri)
 {
  try
  {
   // 讀取uri所在的圖片
   Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
   return bitmap;
  }
  catch (Exception e)
  {
   Log.e("[Android]", e.getMessage());
   Log.e("[Android]", "目錄爲:" + uri);
   e.printStackTrace();
   return null;
  }
 }

4、Android圖片拖動效果(Gallery及ImageAdapter用法)

  1. public class Activity01 extends Activity
  2. {
  3. /**
  4. * Gallery類概述(Gallery)此單詞翻譯過來爲畫廊,美術館 一種view,以水平列表的方式顯示在屏幕中央 看一眼圖片就知道咋回事了
  5. * 此類繼承了 AbsSpinner
  6. */
  7. @Override
  8. public void onCreate(Bundle savedInstanceState)
  9. {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. // 得到Gallery對象
  13. Gallery g = (Gallery) findViewById(R.id.Gallery01);
  14. // 添加ImageAdapter給Gallery對象 注意哦Gallery類並無setAdapter這個方法
  15. // 這個方法是從AbsSpinner類繼承的
  16. g.setAdapter(new ImageAdapter(this));
  17. // 設置Gallery的背景圖片
  18. g.setBackgroundResource(R.drawable.bg0);
  19. // 設置Gallery的事件監聽
  20. g.setOnItemClickListener(new GalleryItemListener());
  21. }
  22. class GalleryItemListener implements OnItemClickListener
  23. {
  24. public void onItemClick(AdapterView<?> parent, View view, int position,
  25. long id) {
  26. Toast.makeText(Activity01.this, 」你選擇了」 + (position + 1) + 」 號圖片」,
  27. Toast.LENGTH_SHORT).show();
  28. }
  29. }
  30. }
public class Activity01 extends Activity
	{
		/**
		 * Gallery類概述(Gallery)此單詞翻譯過來爲畫廊,美術館 一種view,以水平列表的方式顯示在屏幕中央 看一眼圖片就知道咋回事了
		 * 此類繼承了 AbsSpinner
		 */
		@Override
		public void onCreate(Bundle savedInstanceState)
		{
			super.onCreate(savedInstanceState);
			setContentView(R.layout.main);
			// 得到Gallery對象
			Gallery g = (Gallery) findViewById(R.id.Gallery01);
			// 添加ImageAdapter給Gallery對象 注意哦Gallery類並無setAdapter這個方法
			// 這個方法是從AbsSpinner類繼承的
			g.setAdapter(new ImageAdapter(this));
			// 設置Gallery的背景圖片
			g.setBackgroundResource(R.drawable.bg0);
			// 設置Gallery的事件監聽
			g.setOnItemClickListener(new GalleryItemListener());
		}

		class GalleryItemListener implements OnItemClickListener
		{
			public void onItemClick(AdapterView<?> parent, View view, int position,
		long id) {
		Toast.makeText(Activity01.this, 」你選擇了」 + (position + 1) + 」 號圖片」,
		Toast.LENGTH_SHORT).show();
		}
		}
	}

ImageAdapter類繼承自BaseAdapter類 繼承BaseAdapter類就會實現一些方法 這些方法能夠用來 設置圖片源、獲取圖片個數、設置顯示的方式等等。

  1. public class ImageAdapter extends BaseAdapter
  2. {
  3. // 定義Context
  4. private Context mContext;
  5. // 定義整型數組 即圖片源
  6. private Integer[] mImageIds =
  7. { R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4,
  8. R.drawable.img5, R.drawable.img6, R.drawable.img7,
  9. R.drawable.img8, };
  10. // 聲明ImageAdapter
  11. public ImageAdapter(Context c)
  12. {
  13. mContext = c;
  14. }
  15. // 獲取圖片的個數
  16. public int getCount()
  17. {
  18. return mImageIds.length;
  19. }
  20. // 獲取圖片在庫中的位置
  21. public Object getItem(int position)
  22. {
  23. return position;
  24. }
  25. // 獲取圖片ID
  26. public long getItemId(int position)
  27. {
  28. return position;
  29. }
  30. public View getView(int position, View convertView, ViewGroup parent)
  31. {
  32. ImageView imageview = new ImageView(mContext);
  33. // 給ImageView設置資源
  34. imageview.setImageResource(mImageIds[position]);
  35. // 設置佈局 圖片120*120
  36. imageview.setLayoutParams(new Gallery.LayoutParams(120, 120));
  37. // 設置顯示比例類型
  38. imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
  39. return imageview;
  40. }
  41. }
public class ImageAdapter extends BaseAdapter
	{
		// 定義Context
		private Context mContext;
		// 定義整型數組 即圖片源
		private Integer[] mImageIds =
		{ R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4,
				R.drawable.img5, R.drawable.img6, R.drawable.img7,
				R.drawable.img8, };

		// 聲明ImageAdapter
		public ImageAdapter(Context c)
		{
			mContext = c;
		}

		// 獲取圖片的個數
		public int getCount()
		{
			return mImageIds.length;
		}

		// 獲取圖片在庫中的位置
		public Object getItem(int position)
		{
			return position;
		}

		// 獲取圖片ID
		public long getItemId(int position)
		{
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent)
		{
			ImageView imageview = new ImageView(mContext);
			// 給ImageView設置資源
			imageview.setImageResource(mImageIds[position]);
			// 設置佈局 圖片120*120
			imageview.setLayoutParams(new Gallery.LayoutParams(120, 120));
			// 設置顯示比例類型
			imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
			return imageview;
		}
	}

最後佈局文件.

  1. <?xml version=」1.0″ encoding=」utf-8″?>
  2. <Gallery xmlns:android=」http://schemas.android.com/apk/res/android」
  3. android:id=」@+id/Gallery01″
  4. android:layout_width=」fill_parent」
  5. android:layout_height=」fill_parent」
  6. android:spacing=」2px」
  7. >
  8. <!– android:spacing=」2px」用來設置圖片之間的間距 –>
  9. </Gallery>
<?xml version=」1.0″ encoding=」utf-8″?>
<Gallery xmlns:android=」http://schemas.android.com/apk/res/android」
android:id=」@+id/Gallery01″
android:layout_width=」fill_parent」
android:layout_height=」fill_parent」
android:spacing=」2px」
>
<!– android:spacing=」2px」用來設置圖片之間的間距 –>
</Gallery>

5、介紹一個重要方法那就是requestWindowFeature(featrueId),它的功能是啓用窗體的擴展特性。參數是Window類中定義的常量。數組

枚舉常量ide

  1. 1.DEFAULT_FEATURES:系統默認狀態,通常不須要指定
  2. 2.FEATURE_CONTEXT_MENU:啓用ContextMenu,默認該項已啓用,通常無需指定
  3. 3.FEATURE_CUSTOM_TITLE:自定義標題。當須要自定義標題時必須指定。如:標題是一個按鈕時
  4. 4.FEATURE_INDETERMINATE_PROGRESS:不肯定的進度
  5. 5.FEATURE_LEFT_ICON:標題欄左側的圖標
  6. 6.FEATURE_NO_TITLE:吳標題
  7. 7.FEATURE_OPTIONS_PANEL:啓用「選項面板」功能,默認已啓用。
  8. 8.FEATURE_PROGRESS:進度指示器功能
  9. 9.FEATURE_RIGHT_ICON:標題欄右側的圖標
1.DEFAULT_FEATURES:系統默認狀態,通常不須要指定
2.FEATURE_CONTEXT_MENU:啓用ContextMenu,默認該項已啓用,通常無需指定
3.FEATURE_CUSTOM_TITLE:自定義標題。當須要自定義標題時必須指定。如:標題是一個按鈕時
4.FEATURE_INDETERMINATE_PROGRESS:不肯定的進度
5.FEATURE_LEFT_ICON:標題欄左側的圖標
6.FEATURE_NO_TITLE:吳標題
7.FEATURE_OPTIONS_PANEL:啓用「選項面板」功能,默認已啓用。
8.FEATURE_PROGRESS:進度指示器功能
9.FEATURE_RIGHT_ICON:標題欄右側的圖標

  1. // 隱藏頂部程序名稱 寫在setContentView(R.layout.xxxx);以前,否則報錯
  2. requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
  3. requestWindowFeature(Window.FEATURE_NO_TITLE);
  4. // 隱藏狀態欄
  5. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  6. WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 隱藏頂部程序名稱 寫在setContentView(R.layout.xxxx);以前,否則報錯
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);		
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		
		// 隱藏狀態欄
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

6、使用MediaStore.Images和 Cursor查詢本地圖片和圖片縮略圖

先看一個實例:佈局

  1. String[] projection = { MediaStore.Images.Thumbnails._ID ,MediaStore.Images.Thumbnails.DATA};
  2. Cursor cursor = mActivity.getContentResolver().query(
  3. MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,//指定縮略圖數據庫的Uri
  4. projection,//指定所要查詢的字段
  5. MediaStore.Images.Thumbnails._ID + " = ?",//查詢條件
  6. new String[] {"123" }, //查詢條件中問號對應的值
  7. null);
  8. cursor.moveToFirst();
  9. String id = cursor.getString(0);
  10. String data = cursor.getString(1);
String[] projection = { MediaStore.Images.Thumbnails._ID ,MediaStore.Images.Thumbnails.DATA};
Cursor cursor = mActivity.getContentResolver().query(
    MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,//指定縮略圖數據庫的Uri
    projection,//指定所要查詢的字段
    MediaStore.Images.Thumbnails._ID + " = ?",//查詢條件
    new String[] {"123" }, //查詢條件中問號對應的值
    null);
cursor.moveToFirst();
String id = cursor.getString(0);
String data = cursor.getString(1);

查詢圖片縮略圖數據庫,獲取id等於123的縮略圖信息。post

轉換成Sql語句即爲 select MediaStore.Images.Thumbnails._ID ,MediaStore.Images.Thumbnails.DATA from MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI where MediaStore.Images.Thumbnails._ID = 123學習

若是要查詢圖片,Uri地址爲:MediaStore.Images.Media.EXTERNAL_CONTENT_URI

當要獲取縮略圖時:Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail (mActivity.getContentResolver(), id, Thumbnails.MICRO_KIND, null)


(1)讀取SD卡上面的圖片信息

  1. //想要的返回值所在的列
  2. String[] projection = { MediaStore.Images.Thumbnails._ID};
  3. //圖片信息存儲在 android.provider.MediaStore.Images.Thumbnails數據庫
  4. //快速查詢數據庫中的圖片對應存放路勁
  5. Cursor cursor = managedQuery(
  6. MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
  7. projection, //List of columns to return :想要他返回的列
  8. null, // Return all rows
  9. null,
  10. null);
  11. int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
  12. uriArray = new Uri[cursor.getCount()];//把圖片路徑放在數組中
//想要的返回值所在的列   
        String[] projection = { MediaStore.Images.Thumbnails._ID};  
        //圖片信息存儲在 android.provider.MediaStore.Images.Thumbnails數據庫    
        //快速查詢數據庫中的圖片對應存放路勁            
        Cursor cursor = managedQuery(  
                MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,  
                projection, //List of columns to return :想要他返回的列   
                null, // Return all rows   
                null,  
                null);  
        int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);  
        uriArray = new Uri[cursor.getCount()];//把圖片路徑放在數組中

(2)將讀取的圖片生成縮略圖

  1. while(cursor.moveToNext()&&i<cursor.getCount())
  2. { //移到指定的位置,遍歷數據庫
  3. cursor.moveToPosition(i);
  4. uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,cursor.getInt(columnIndex)+"");
  5. uriArray[i]=uri;
  6. try {
  7. bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
  8. if (bitmap != null) {
  9. //將原來的位圖轉換成新的位圖
  10. newBitmap = Bitmap.createScaledBitmap(bitmap,80, 80,true);
  11. bitmap.recycle();//釋放內存
  12. if (newBitmap != null) {
  13. publishProgress(new LoadedImage(newBitmap));
  14. }
  15. }
  16. } catch (IOException e) {}
  17. i++;
  18. }
while(cursor.moveToNext()&&i<cursor.getCount())  
        {   //移到指定的位置,遍歷數據庫   
            cursor.moveToPosition(i);  
            uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,cursor.getInt(columnIndex)+"");  
            uriArray[i]=uri;  
            try {  
                bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));  
                if (bitmap != null) {  
                    //將原來的位圖轉換成新的位圖   
                    newBitmap = Bitmap.createScaledBitmap(bitmap,80, 80,true);  
                    bitmap.recycle();//釋放內存   
                    if (newBitmap != null) {  
                        publishProgress(new LoadedImage(newBitmap));  
                    }  
                }  
            } catch (IOException e) {}  
            i++;  
        }

android在處理一寫圖片資源的時候,會進行一些類型的轉換,如今有空整理一下:

一、Drawable → Bitmap

  1. public static Bitmap drawableToBitmap(Drawable drawable) {
  2. Bitmap bitmap = Bitmap
  3. .createBitmap(
  4. drawable.getIntrinsicWidth(),
  5. drawable.getIntrinsicHeight(),
  6. drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
  7. : Bitmap.Config.RGB_565);
  8. Canvas canvas = new Canvas(bitmap);
  9. //canvas.setBitmap(bitmap);
  10. drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
  11. drawable.draw(canvas);
  12. return bitmap;
  13. }
public static Bitmap drawableToBitmap(Drawable drawable) {   
           
        Bitmap bitmap = Bitmap   
                        .createBitmap(   
                                        drawable.getIntrinsicWidth(),   
                                        drawable.getIntrinsicHeight(),   
                                        drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888   
                                                        : Bitmap.Config.RGB_565);   
        Canvas canvas = new Canvas(bitmap);   
        //canvas.setBitmap(bitmap);   
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());   
        drawable.draw(canvas);   
        return bitmap;   
}

二、從資源中獲取Bitmap

  1. Resources res=getResources();
  2. Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
Resources res=getResources();   
  
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);

三、Bitmap → byte[]

  1. private byte[] Bitmap2Bytes(Bitmap bm){
  2. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  3. bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
  4. return baos.toByteArray();
  5. }
private byte[] Bitmap2Bytes(Bitmap bm){   
    ByteArrayOutputStream baos = new ByteArrayOutputStream();     
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);     
    return baos.toByteArray();   
   }

四、 byte[] → Bitmap

  1. private Bitmap Bytes2Bimap(byte[] b){
  2. if(b.length!=0){
  3. return BitmapFactory.decodeByteArray(b, 0, b.length);
  4. }
  5. else {
  6. return null;
  7. }
  8. }
private Bitmap Bytes2Bimap(byte[] b){   
            if(b.length!=0){   
                return BitmapFactory.decodeByteArray(b, 0, b.length);   
            }   
            else {   
                return null;   
            }   
      }


7、保存圖片到圖庫

Images.Media.EXTERNAL_CONTENT_URI這是一個系統圖片數據表,圖庫裏面的圖片數據都是從這裏面查詢出來的;調用insert就是往這個表裏面插入一條數據,插入成功的話,下次加載圖庫,就能夠把新加入的數據從這個表中查詢並展現出來了,


  1. Images.Media.EXTERNAL_CONTENT_URI:數據表確定就包括一些屬性字段,以下:
  2. values.put(Images.Media.TITLE, title);
  3. values.put(Images.Media.DISPLAY_NAME, filename);
  4. values.put(Images.Media.DATE_TAKEN, dateTaken);
  5. values.put(Images.Media.MIME_TYPE, IMAGE_MIME_TYPE);
  6. values.put(Images.Media.ORIENTATION, degree[0]);
  7. values.put(Images.Media.DATA, filePath);
  8. values.put(Images.Media.SIZE, size);
Images.Media.EXTERNAL_CONTENT_URI:數據表確定就包括一些屬性字段,以下:
values.put(Images.Media.TITLE, title);
values.put(Images.Media.DISPLAY_NAME, filename);
values.put(Images.Media.DATE_TAKEN, dateTaken);
values.put(Images.Media.MIME_TYPE, IMAGE_MIME_TYPE);
values.put(Images.Media.ORIENTATION, degree[0]);
values.put(Images.Media.DATA, filePath);
values.put(Images.Media.SIZE, size);


上面這些內容的鍵值就是數據表裏面的字段,固然這並非全部的,只是傳一些比較重要和經常使用的保存起來;好比圖片的名稱、時間、大小、類型等。


8、根據Uri獲取文件絕對路徑


  1. protected String getAbsoluteImagePath(Uri uri)
  2. {
  3. // can post image
  4. String [] proj={MediaStore.Images.Media.DATA};
  5. Cursor cursor = managedQuery( uri,
  6. proj, // Which columns to return
  7. null, // WHERE clause; which rows to return (all rows)
  8. null, // WHERE clause selection arguments (none)
  9. null); // Order-by clause (ascending by name)
  10. int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  11. cursor.moveToFirst();
  12. return cursor.getString(column_index);
  13. 原文連接:http://blog.csdn.net/yf210yf/article/details/7295577 
相關文章
相關標籤/搜索