【Android学习】图片
1,ImageView(圖片視圖)
1)概念
ImageView繼承自View組件,它的主要功能是用于顯示圖片,且任何Drawable對象都可使用ImageView來顯示。
Android中不僅可以將擴展名為.png,.jpg,.gif的普通圖片作為圖片資源,而且可以將擴展名為.9.png的9-Patch圖片作為圖片資源。擴展名為.png,.jpg,.gif的普通圖片較為常見,他們通常是通過繪圖軟件完成的。而9-Patch圖片是通過使用Android SDK中的提供的工具Draw 9-patch生成的。那為什么要使用9-Patch這種圖片呢?原因是:與普通圖片不同,使用9-Patch圖片作為屏幕或按鈕的背景時,當屏幕的尺寸或按鈕的大小改變時,圖片可自動縮放,達到不失真的效果。
2)屬性
①
--scaleType 設置圖片的填充方式,相關方法setScaleType(ImageView.ScaleType)ImageView.ScaleType / android:scaleType值:
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 用矩陣來繪制,動態縮小放大圖片來顯示。
ImageView
②
2,圖片加載
1)大量圖片加載慢
按需加載,不需要的釋放。
必要時做一個存放圖片地址的映射數組,這樣圖片刪掉了也可以從數組里面取對應的路徑。
2)加載大圖片
android系統給圖片分配的內存只有8M,當加載大量圖片時往往會出現OOM。
①盡量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖
這些函數在完成decode后,最終都是通過java層的createBitmap來完成的,需要消耗更多內存,可以通過BitmapFactory.decodeStream方法,創建出一個bitmap,再將其設為ImageView的 source
②使用BitmapFactory.Options對圖片進行壓縮
③運用Java軟引用,進行圖片緩存,將需要經常加載的圖片放進緩存里,避免反復加載
及時銷毀不再使用的Bitmap對象
3)圖片選擇器
GitHub:ImagePicker
使用步驟:
①引入依賴。
②初始化ImagePicker。
private void initImagePicker() {ImagePicker imagePicker = ImagePicker.getInstance();imagePicker.setImageLoader(new GlideImageLoader()); //設置圖片加載器imagePicker.setShowCamera(true); //顯示拍照按鈕imagePicker.setCrop(true); //允許裁剪(單選才有效)imagePicker.setSaveRectangle(true); //是否按矩形區域保存imagePicker.setSelectLimit(maxImgCount); //選中數量限制imagePicker.setStyle(CropImageView.Style.RECTANGLE); //裁剪框的形狀imagePicker.setFocusWidth(800); //裁剪框的寬度。單位像素(圓形自動取寬高最小值)imagePicker.setFocusHeight(800); //裁剪框的高度。單位像素(圓形自動取寬高最小值)imagePicker.setOutPutX(1000); //保存文件的寬度。單位像素imagePicker.setOutPutY(1000); //保存文件的高度。單位像素 }③跳轉。
//打開選擇,本次允許選擇的數量(通過maxImgCount控制一次選擇照片的數量) ImagePicker.getInstance().setSelectLimit(maxImgCount); Intent intent1 = new Intent(this, ImageGridActivity.class); /* 如果需要進入選擇的時候顯示已經選中的圖片, * 詳情請查看ImagePickerActivity * */ startActivityForResult(intent1, REQUEST_CODE_SELECT);④onActivityResult方法回調
if (resultCode == ImagePicker.RESULT_CODE_ITEMS) {//添加圖片返回if (data != null && requestCode == REQUEST_CODE_SELECT) {images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS);if (images != null) {selImageList.clear();selImageList.addAll(images);ImageItem imageItem = selImageList.get(0);//imageItem.path為地址 Glide.with(this)//context.load(userImage)//uri.placeholder(R.mipmap.icon_cover_default)//占位圖(不可用于CircleImageView圖片的加載).error(R.drawable.nmtittle)//錯誤圖.into(myTitleImage);//ImageView控件}}} else if (resultCode == ImagePicker.RESULT_CODE_BACK) {//預覽圖片返回if (data != null && requestCode == REQUEST_CODE_PREVIEW) {images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_IMAGE_ITEMS);if (images != null) {selImageList.clear();selImageList.addAll(images);ImageItem imageItem = selImageList.get(0); ImagePicker.getInstance().getImageLoader().displayImage(this, imageItem.path, IV_photo, 0, 0);//IV_photo為要顯示圖片的控件}}}⑤導入ClideImageLoader(圖片加載器)。
4)background
①background屬性
對于src,圖片不會拉伸。
如果以background,圖片會根據View的寬度進行拉伸,解決方案是:
如下xml文件:tv_background.xml,放于drawable文件夾中。
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android"android:src="@drawable/toolbar_bg"android:tileMode="disabled" android:gravity="top" > </bitmap>可以之間被 android:background使用,且圖片不會出現拉伸。
注意:此方案可以把大圖片放小,但無法把小圖片放大。筆者暫時沒有找到可以把bitmap適配于大屏手機的辦法。來個大大指教下!
②setBackgroundResource、setBackground比較
功能相同,區別在于效率。
對于使用頻率比較高的,從xm讀取資源相當于一次IO,可提前通過getResources()存儲,然后每次直接使用即可。
5)在不壓縮的情況下加載高清大圖
使用BitmapRegionDecoder進行布局加載。
3,Bitmap的加載和Cache
4,Drawable
5,drawableLeft、drawableRight、drawableTop、drawableBottom
1)xml設置
android:drawablePadding="5dp" android:drawableRight="@drawable/icon_new"2)java設置
//void android.widget.TextView.setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) Drawable mDrawable = getResources().getDrawable(drawable); mDrawable.setBounds(0, 0, mDrawable.getMinimumWidth(), mDrawable.getMinimumHeight()); btn_Left.setCompoundDrawables(mDrawable, null, null, null);3)圖片點擊
①點擊圖片切換決定et_password顯示的密碼是明文還是密文。
@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (v.getId()) {case R.id.act_login_et_password:// et.getCompoundDrawables()得到一個長度為4的數組,分別表示左右上下四張圖片Drawable drawable = et_password.getCompoundDrawables()[2];//如果右邊沒有圖片,不再處理if (drawable == null)return false;//如果不是按下事件,不再處理if (event.getAction() != MotionEvent.ACTION_UP)return false;if (event.getX() > et_password.getWidth()- et_password.getPaddingRight()- drawable.getIntrinsicWidth()){isChecked = !isChecked;if(isChecked){et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);}else{et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);}}break;default:break;}return false;}6,實踐
1)圖片分辨率
H 分辨率480*800
XH 分辨率1280*720
XXH 分辨率1920*1080
在Android studio 中,自定義圖片放在drawable中,切圖根據分辨率不同,放在mipmap文件夾中(可以自適應屏幕)。
2)屏幕分辨率自適應
①組件大小:權重(layout_weight)、具體像素(dip)
②圖片:drawable-hdpi、.9.png圖片
③AndroidManifest.xml
android:anyDensity值為true,系統會依據屏幕密度,自動去找對應的文件夾。
如果drawable-hpdi中有高密度圖片,其它兩個文件夾中沒有對應圖片資源,那么系統會去加載drawable-hdpi中的資源。
3)Tab
①tab切換底部線條動畫
方案:
TextView設置切換2種背景。
shape寫的只有底部有橫線的圖形:
總結
以上是生活随笔為你收集整理的【Android学习】图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AE2022 for Mac安装包+安装
- 下一篇: android sina oauth2.