ZhuHuDaily问题

2016-10-10  本文已影响51人  狮_子歌歌

Android小Demo遇到的问题

在开发中遇到的问题:

ImageView属性

adjustViewBounds

调整ImageView的界限来保持图像纵横比不变。

XML定义里的android:adjustViewBounds="true"会将这个ImageView的scaleType设为fitCenter。不过这个fitCenter会被后面定义的scaleType属性覆盖(如果定义了的话),除非在Java代码里再次显示调用setAdjustViewBounds(true)。

设置该属性无效的情况:

实现属性效果,如果两者中一个是定值,一个是wrap_content,比如layout_width="100px",layout_height="wrap_content"时,ImageView的宽将始终是100px,而高则分两种情况:

参考自博文ImageView的android:adjustViewBounds属性

scaleType

该属性值由一下几种可以选择:

这里有一个属性值比较有疑问,于是写了一个例子来实践下:

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);
    }

分析:在这里我对其中一个ImageView设定了指定的平移矩阵,并且效果确实和按照默认的图像矩阵绘制图片有区别。

效果

ScaleType Matrix.png

Window.setFlags

由于调用该方法的Activity是一个SplashActivity,所以我们需要实现Activity的全屏:没有ActionBar,没有标题栏,以及隐藏状态栏。

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();
    }

有一点需要注意,官方文档指出: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()之前调用setFlags()。

setFlags()与addFlags()区别

addFlags()源码:

public void addFlags(int flags) {  
        setFlags(flags, flags);  
}  

其实两者可以这样等价:

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,   
            WindowManager.LayoutParams.FLAG_FULLSCREEN);  

等价于:

this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

setFlags()可以实现多种效果

getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

可以实现窗体背景模糊

参考自博文UI效果(1):实现Activity全屏

个人理解

通过设置Window.setFlags()来实现Activity的全屏就是为了隐藏状态栏,实现状态栏沉浸的效果。

通过File获取路径

有两种方法可以获取File的路径:getAbsolutePath(),getPath.

getAbsolutePath()

返回File对象表示的完整的绝对文件名或目录名。这里不管创建FIle对象时用的是相对文件名还是绝对文件名,它都会返回整个完整的路径。

getPath()

返回File对象表示的完整的路径名和文件名。这里返回的就是创建FIle对象时,传递给构造函数的path/file_name字符串。

Activity.overaridePaddingTransition()

上一篇下一篇

猜你喜欢

热点阅读