Android小Demo遇到的問(wèn)題
在開(kāi)發(fā)中遇到的問(wèn)題:
- ImageView屬性,adjustViewBounds,scaleType
- Window.setFlags
- 狀態(tài)欄著色
- 通過(guò)File對(duì)象獲取path
- Activity.overaridePaddingTransition()
ImageView屬性
adjustViewBounds
調(diào)整ImageView的界限來(lái)保持圖像縱橫比不變。
XML定義里的android:adjustViewBounds="true"會(huì)將這個(gè)ImageView的scaleType設(shè)為fitCenter。不過(guò)這個(gè)fitCenter會(huì)被后面定義的scaleType屬性覆蓋(如果定義了的話),除非在Java代碼里再次顯示調(diào)用setAdjustViewBounds(true)。
設(shè)置該屬性無(wú)效的情況:
- 如果設(shè)置的layout_width與layout_height都是定值,那么設(shè)置adjustViewBounds是沒(méi)有效果的,ImageView將始終是設(shè)定的定值的寬高。
- 如果設(shè)置的layout_width與layout_height都是wrap_content,那么設(shè)置adjustViewBounds是沒(méi)有意義的,因?yàn)镮mageView將始終與圖片擁有相同的寬高比(但是并不是相同的寬高值,通常都會(huì)放大一些)。
實(shí)現(xiàn)屬性效果,如果兩者中一個(gè)是定值,一個(gè)是wrap_content,比如layout_width="100px",layout_height="wrap_content"時(shí),ImageView的寬將始終是100px,而高則分兩種情況:
- 當(dāng)圖片的寬小于100px時(shí),layout_height將與圖片的高相同,即圖片不會(huì)縮放,完整顯示在ImageView中,ImageView高度與圖片實(shí)際高度相同。圖片沒(méi)有占滿(mǎn)ImageView,ImageView中有空白。
- 當(dāng)圖片的寬大于等于100px時(shí),此時(shí)ImageView將與圖片擁有相同的寬高比,因此ImageView的layout_height值為:100除以圖片的寬高比。比如圖片是500X500的,那么layout_height是100。圖片將保持寬高比縮放,完整顯示在ImageView中,并且完全占滿(mǎn)ImageView。
scaleType
該屬性值由一下幾種可以選擇:
- matrix,繪制時(shí),使用圖像矩陣方式縮放。圖像矩陣可以通過(guò) setImageMatrix(Matrix) 設(shè)置。
- fitXY,橫向、縱向獨(dú)立縮放,以適應(yīng)該ImageView。
- fitCenter,保持縱橫比縮放圖片,縮放完成后將圖片放在ImageView的中央。
- fitStart,保持縱橫比縮放圖片,并且將圖片放在ImageView的左上角。
- fitEnd,保持縱橫比縮放圖片,縮放完成后將圖片放在ImageView的右下角。
- center,把圖片放在ImageView的中央,但是不進(jìn)行任何縮放。
- centerInside,保持縱橫比縮放圖片,以使得ImageView能完全顯示該圖片。
- centerCrop,保持縱橫比縮放圖片,以使圖片能完全覆蓋ImageView。
這里有一個(gè)屬性值比較有疑問(wèn),于是寫(xiě)了一個(gè)例子來(lái)實(shí)踐下:
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="android.example.com.imageviewusage.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Scale Type Specify Matrix"
android:textSize="16sp"/>
<ImageView
android:id="@+id/id_img_matrix"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:scaleType="matrix"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Scale Type Default Center"
android:textSize="16sp"/>
<ImageView
android:id="@+id/id_img_center"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:scaleType="matrix"/>
</LinearLayout>
Java
private void initView() {
mImgMatrix = (ImageView) findViewById(R.id.id_img_matrix);
mImgCenter = (ImageView) findViewById(R.id.id_img_center);
Matrix matrix = new Matrix();
matrix.setTranslate(30, 20);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.start, options);
Bitmap bitmap = ScaleBitmap.scaleBitmap(options, this);
mImgCenter.setImageBitmap(bitmap);
mImgMatrix.setImageMatrix(matrix);
mImgMatrix.setImageBitmap(bitmap);
}
分析:在這里我對(duì)其中一個(gè)ImageView設(shè)定了指定的平移矩陣,并且效果確實(shí)和按照默認(rèn)的圖像矩陣?yán)L制圖片有區(qū)別。
效果

Window.setFlags
由于調(diào)用該方法的Activity是一個(gè)SplashActivity,所以我們需要實(shí)現(xiàn)Activity的全屏:沒(méi)有ActionBar,沒(méi)有標(biāo)題欄,以及隱藏狀態(tài)欄。
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_splash);
initView();
}
有一點(diǎn)需要注意,官方文檔指出:Note that some flags must be set before the window decoration is created (by the first call to setContentView(View, android.view.ViewGroup.LayoutParams) or getDecorView(): FLAG_LAYOUT_IN_SCREEN and FLAG_LAYOUT_INSET_DECOR. These will be set for you based on the windowIsFloating attribute. 意思大概是要在setContentView()之前調(diào)用setFlags()。
setFlags()與addFlags()區(qū)別
addFlags()源碼:
public void addFlags(int flags) {
setFlags(flags, flags);
}
其實(shí)兩者可以這樣等價(jià):
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
等價(jià)于:
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setFlags()可以實(shí)現(xiàn)多種效果
getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
可以實(shí)現(xiàn)窗體背景模糊
個(gè)人理解
通過(guò)設(shè)置Window.setFlags()來(lái)實(shí)現(xiàn)Activity的全屏就是為了隱藏狀態(tài)欄,實(shí)現(xiàn)狀態(tài)欄沉浸的效果。
通過(guò)File獲取路徑
有兩種方法可以獲取File的路徑:getAbsolutePath(),getPath.
getAbsolutePath()
返回File對(duì)象表示的完整的絕對(duì)文件名或目錄名。這里不管創(chuàng)建FIle對(duì)象時(shí)用的是相對(duì)文件名還是絕對(duì)文件名,它都會(huì)返回整個(gè)完整的路徑。
getPath()
返回File對(duì)象表示的完整的路徑名和文件名。這里返回的就是創(chuàng)建FIle對(duì)象時(shí),傳遞給構(gòu)造函數(shù)的path/file_name字符串。