1. 程式人生 > >WindowUtils【窗口工具類】

WindowUtils【窗口工具類】

win ets ide nac .cn sla float 透明 new

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

前言

判斷當前界面是橫屏還是豎屏;

獲取當前界面方向。

效果圖

技術分享 技術分享

代碼分析

isLandscape(Context context): 判斷是否橫屏

isPortrait(Context context): 判斷是否豎屏

getScreenOrientation(Activity activity): 獲取界面方向

使用步驟

一、項目組織結構圖

技術分享

註意事項:

1、導入類文件後需要change包名以及重新import R文件路徑

2、Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制裏面的內容,不要整個覆蓋

二、導入步驟

將WindowUtils復制到項目中

package com.why.project.windowutilsdemo.utils; /**
 * Copyright 2014 Zhenguo Jin ([email protected])
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * 
http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License.
*/ import android.animation.ValueAnimator; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.util.DisplayMetrics; import android.view.Surface; import android.view.Window; import android.view.WindowManager; /** * 窗口工具箱 * * @author zhenguo */ public final class WindowUtils { /** * Don‘t let anyone instantiate this class. */ private WindowUtils() { throw new Error("Do not need instantiate!"); } /** * 獲取當前窗口的旋轉角度 * * @param activity activity * @return int */ public static int getDisplayRotation(Activity activity) { switch (activity.getWindowManager().getDefaultDisplay().getRotation()) { case Surface.ROTATION_0: return 0; case Surface.ROTATION_90: return 90; case Surface.ROTATION_180: return 180; case Surface.ROTATION_270: return 270; default: return 0; } } /** * 當前是否是橫屏 * * @param context context * @return boolean */ public static final boolean isLandscape(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; } /** * 當前是否是豎屏 * * @param context context * @return boolean */ public static final boolean isPortrait(Context context) { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; } /** * 調整窗口的透明度 1.0f,0.5f 變暗 * * @param from from>=0&&from<=1.0f * @param to to>=0&&to<=1.0f * @param context 當前的activity */ public static void dimBackground(final float from, final float to, Activity context) { final Window window = context.getWindow(); ValueAnimator valueAnimator = ValueAnimator.ofFloat(from, to); valueAnimator.setDuration(500); valueAnimator.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { WindowManager.LayoutParams params = window.getAttributes(); params.alpha = (Float) animation.getAnimatedValue(); window.setAttributes(params); } }); valueAnimator.start(); } /** * 獲取界面方向 */ public static int getScreenOrientation(Activity activity) { int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); DisplayMetrics dm = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; int height = dm.heightPixels; int orientation; // if the device‘s natural orientation is portrait: if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && height > width || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && width > height) { switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; case Surface.ROTATION_270: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; default: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; } } // if the device‘s natural orientation is landscape or if the device // is square: else { switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; case Surface.ROTATION_270: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; default: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; } } return orientation; } }

三、使用方法

package com.why.project.windowutilsdemo;

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.why.project.windowutilsdemo.utils.WindowUtils;

public class MainActivity extends AppCompatActivity {

    private TextView tv_show;
    private Button btn_switch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        initEvents();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //橫豎屏切換的時候也會執行
        initDatas();
    }

    private void initViews() {
        tv_show = (TextView) findViewById(R.id.tv_show);
        btn_switch = (Button) findViewById(R.id.btn_switch);
    }

    private void initDatas() {
        if (WindowUtils.isLandscape(this)) {
            tv_show.setText("當前處於橫屏");
        }
        if (WindowUtils.isPortrait(this)) {
            tv_show.setText("當前處於豎屏");
        }
    }

    private void initEvents() {
        btn_switch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                toggleFullScreen();
            }
        });
    }

    /**
     * 全屏切換,點擊全屏按鈕
     */
    private void toggleFullScreen() {
        if (WindowUtils.getScreenOrientation(this) == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    }
}

混淆配置

參考資料

暫時空缺

項目demo下載地址

https://github.com/haiyuKing/WindowUtilsDemo

WindowUtils【窗口工具類】