【Android学习】图片
1,ImageView(圖片視圖)
1)概念
ImageView繼承自View組件,它的主要功能是用于顯示圖片,且任何Drawable對(duì)象都可使用ImageView來顯示。
Android中不僅可以將擴(kuò)展名為.png,.jpg,.gif的普通圖片作為圖片資源,而且可以將擴(kuò)展名為.9.png的9-Patch圖片作為圖片資源。擴(kuò)展名為.png,.jpg,.gif的普通圖片較為常見,他們通常是通過繪圖軟件完成的。而9-Patch圖片是通過使用Android SDK中的提供的工具Draw 9-patch生成的。那為什么要使用9-Patch這種圖片呢?原因是:與普通圖片不同,使用9-Patch圖片作為屏幕或按鈕的背景時(shí),當(dāng)屏幕的尺寸或按鈕的大小改變時(shí),圖片可自動(dòng)縮放,達(dá)到不失真的效果。
2)屬性
①
--scaleType 設(shè)置圖片的填充方式,相關(guān)方法setScaleType(ImageView.ScaleType)ImageView.ScaleType / android:scaleType值:
CENTER /center 按圖片的原來size居中顯示,當(dāng)圖片長(zhǎng)/寬超過View的長(zhǎng)/寬,則截取圖片的居中部分顯示
CENTER_CROP / centerCrop 按比例擴(kuò)大圖片的size居中顯示,使得圖片長(zhǎng)(寬)等于或大于View的長(zhǎng)(寬)
CENTER_INSIDE / centerInside 將圖片的內(nèi)容完整居中顯示,通過按比例縮小或原來的size使得圖片長(zhǎng)/寬等于或小于View的長(zhǎng)/寬
FIT_CENTER / fitCenter 把圖片按比例擴(kuò)大/縮小到View的寬度,居中顯示
FIT_END / fitEnd 把圖片按比例擴(kuò)大/縮小到View的寬度,顯示在View的下部分位置
FIT_START / fitStart 把圖片按比例擴(kuò)大/縮小到View的寬度,顯示在View的上部分位置
FIT_XY / fitXY 把圖片不按比例擴(kuò)大/縮小到View的大小顯示
MATRIX / matrix 用矩陣來繪制,動(dòng)態(tài)縮小放大圖片來顯示。
ImageView
②
2,圖片加載
1)大量圖片加載慢
按需加載,不需要的釋放。
必要時(shí)做一個(gè)存放圖片地址的映射數(shù)組,這樣圖片刪掉了也可以從數(shù)組里面取對(duì)應(yīng)的路徑。
2)加載大圖片
android系統(tǒng)給圖片分配的內(nèi)存只有8M,當(dāng)加載大量圖片時(shí)往往會(huì)出現(xiàn)OOM。
①盡量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設(shè)置一張大圖
這些函數(shù)在完成decode后,最終都是通過java層的createBitmap來完成的,需要消耗更多內(nèi)存,可以通過BitmapFactory.decodeStream方法,創(chuàng)建出一個(gè)bitmap,再將其設(shè)為ImageView的 source
②使用BitmapFactory.Options對(duì)圖片進(jìn)行壓縮
③運(yùn)用Java軟引用,進(jìn)行圖片緩存,將需要經(jīng)常加載的圖片放進(jìn)緩存里,避免反復(fù)加載
及時(shí)銷毀不再使用的Bitmap對(duì)象
3)圖片選擇器
GitHub:ImagePicker
使用步驟:
①引入依賴。
②初始化ImagePicker。
private void initImagePicker() {ImagePicker imagePicker = ImagePicker.getInstance();imagePicker.setImageLoader(new GlideImageLoader()); //設(shè)置圖片加載器imagePicker.setShowCamera(true); //顯示拍照按鈕imagePicker.setCrop(true); //允許裁剪(單選才有效)imagePicker.setSaveRectangle(true); //是否按矩形區(qū)域保存imagePicker.setSelectLimit(maxImgCount); //選中數(shù)量限制imagePicker.setStyle(CropImageView.Style.RECTANGLE); //裁剪框的形狀imagePicker.setFocusWidth(800); //裁剪框的寬度。單位像素(圓形自動(dòng)取寬高最小值)imagePicker.setFocusHeight(800); //裁剪框的高度。單位像素(圓形自動(dòng)取寬高最小值)imagePicker.setOutPutX(1000); //保存文件的寬度。單位像素imagePicker.setOutPutY(1000); //保存文件的高度。單位像素 }③跳轉(zhuǎn)。
//打開選擇,本次允許選擇的數(shù)量(通過maxImgCount控制一次選擇照片的數(shù)量) ImagePicker.getInstance().setSelectLimit(maxImgCount); Intent intent1 = new Intent(this, ImageGridActivity.class); /* 如果需要進(jìn)入選擇的時(shí)候顯示已經(jīng)選中的圖片, * 詳情請(qǐng)查看ImagePickerActivity * */ startActivityForResult(intent1, REQUEST_CODE_SELECT);④onActivityResult方法回調(diào)
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)//錯(cuò)誤圖.into(myTitleImage);//ImageView控件}}} else if (resultCode == ImagePicker.RESULT_CODE_BACK) {//預(yù)覽圖片返回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為要顯示圖片的控件}}}⑤導(dǎo)入ClideImageLoader(圖片加載器)。
4)background
①background屬性
對(duì)于src,圖片不會(huì)拉伸。
如果以background,圖片會(huì)根據(jù)View的寬度進(jìn)行拉伸,解決方案是:
如下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使用,且圖片不會(huì)出現(xiàn)拉伸。
注意:此方案可以把大圖片放小,但無法把小圖片放大。筆者暫時(shí)沒有找到可以把bitmap適配于大屏手機(jī)的辦法。來個(gè)大大指教下!
②setBackgroundResource、setBackground比較
功能相同,區(qū)別在于效率。
對(duì)于使用頻率比較高的,從xm讀取資源相當(dāng)于一次IO,可提前通過getResources()存儲(chǔ),然后每次直接使用即可。
5)在不壓縮的情況下加載高清大圖
使用BitmapRegionDecoder進(jìn)行布局加載。
3,Bitmap的加載和Cache
4,Drawable
5,drawableLeft、drawableRight、drawableTop、drawableBottom
1)xml設(shè)置
android:drawablePadding="5dp" android:drawableRight="@drawable/icon_new"2)java設(shè)置
//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)圖片點(diǎn)擊
①點(diǎn)擊圖片切換決定et_password顯示的密碼是明文還是密文。
@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (v.getId()) {case R.id.act_login_et_password:// et.getCompoundDrawables()得到一個(gè)長(zhǎng)度為4的數(shù)組,分別表示左右上下四張圖片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,實(shí)踐
1)圖片分辨率
H 分辨率480*800
XH 分辨率1280*720
XXH 分辨率1920*1080
在Android studio 中,自定義圖片放在drawable中,切圖根據(jù)分辨率不同,放在mipmap文件夾中(可以自適應(yīng)屏幕)。
2)屏幕分辨率自適應(yīng)
①組件大小:權(quán)重(layout_weight)、具體像素(dip)
②圖片:drawable-hdpi、.9.png圖片
③AndroidManifest.xml
android:anyDensity值為true,系統(tǒng)會(huì)依據(jù)屏幕密度,自動(dòng)去找對(duì)應(yīng)的文件夾。
如果drawable-hpdi中有高密度圖片,其它兩個(gè)文件夾中沒有對(duì)應(yīng)圖片資源,那么系統(tǒng)會(huì)去加載drawable-hdpi中的資源。
3)Tab
①tab切換底部線條動(dòng)畫
方案:
TextView設(shè)置切換2種背景。
shape寫的只有底部有橫線的圖形:
總結(jié)
以上是生活随笔為你收集整理的【Android学习】图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AE2022 for Mac安装包+安装
- 下一篇: Android学习之复选框checkbo