ZhuHuDaily問(wèn)題

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。

參考自博文ImageView的android:adjustViewBounds屬性

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ū)別。

效果

ScaleType Matrix.png

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)窗體背景模糊

參考自博文UI效果(1):實(shí)現(xiàn)Activity全屏

個(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字符串。

Activity.overaridePaddingTransition()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,334評(píng)論 0 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,058評(píng)論 25 709
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個(gè)即將畢業(yè)的Android程序媛,開(kāi)始面臨找工作了,...
    左神話閱讀 5,156評(píng)論 7 59
  • 從QQ到微博、再到、微信,科技不斷引領(lǐng)著人們的生活方式! 都是騰訊惹得“禍”。 有了微信,大家便熱衷于發(fā)朋友圈。我...
    遲未末閱讀 801評(píng)論 0 5
  • 東也是個(gè)心中有江湖的人 不知道為什么, 每當(dāng)外面狂風(fēng)四起的時(shí)候 冬也心中的那個(gè)江湖夢(mèng)便開(kāi)始騷動(dòng) 他曾經(jīng)幻想過(guò)有一天...
    西盡閱讀 308評(píng)論 0 7

友情鏈接更多精彩內(nèi)容