关于android的各个屏幕的各个部分的高度

    今天需要找关于找获得屏幕的高度的资料,现在整理一下记录在我的博客当中。

     在获得宽度的时候是没有那么复杂的,只要在getwidth就可以了,但是要获得高度的话就会很麻烦,因为在当前的屏幕中,高度是分为很多部分的,入下图所示。

                                                        

里面的各个部分的高度,我现在来一一说一下怎么在代码中获取。

       先讲4.整个屏幕的高度的获取,下面是Java代码

String dpi=null;
                Display display = getWindowManager().getDefaultDisplay();
            DisplayMetrics dm = new DisplayMetrics(); 
            @SuppressWarnings("rawtypes")
                    Class c;
            try {
                c = Class.forName("android.view.Display");
                @SuppressWarnings("unchecked")
                            Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
                method.invoke(display, dm);
                dpi=dm.heightPixels+"";
            }catch(Exception e){
                e.printStackTrace();
            }  
        Log.i("屏幕总高度",dpi);

其中的dm.heightPixels就是4.屏幕的总高度,获得1.状态栏的Java代码片如下

Rect outRect=new Rect();
    	getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
    	int statusBarHeight=outRect.top;
    	Log.i("状态栏高度",statusBarHeight+"");
statusBarHeight就是 1.状态栏的高度

int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
    	Log.i("标题栏的高度",contentTop-statusBarHeight+"");
contentTop是包括状态栏和标题栏一起的高度,那么contentTop-statusBarHeight就是 2.标题栏的高度。

height=getWindowManager().getDefaultDisplay().getHeight();
Log.i("除去虚拟按键屏幕的高度",height+"");
int contentheight=getWindow().findViewById(Window.ID_ANDROID_CONTENT).getHeight();
Log.i("除去状态栏和标题栏的高度",contentheight+"");
上面两段代码都是获得 3.内容栏的代码,那么 5虚拟按键的高度就很好得知了,4-1-2-3就可以了。

获得控件的7.高度代码很简单的,只要getheight就可以了,就不单独写出来了,讲讲获得6.控件的Y坐标

 lv.getLocationInWindow(position);
int tv_yheight=position[1]
总代码贴在这里:JAVA

package com.jim.nineoldanim;

import java.lang.reflect.Method;

import android.animation.ObjectAnimator;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.Window;
import android.widget.LinearLayout;


public class MainActivity extends Activity {
int height=0;
int tv_height=0;
LinearLayout lv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       lv=(LinearLayout) findViewById(R.id.lv);
       
    }


 
    @SuppressWarnings("deprecation")
	public void click(View v){
          String dpi=null;
                Display display = getWindowManager().getDefaultDisplay();
            DisplayMetrics dm = new DisplayMetrics(); 
            @SuppressWarnings("rawtypes")
                    Class c;
            try {
                c = Class.forName("android.view.Display");
                @SuppressWarnings("unchecked")
                            Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
                method.invoke(display, dm);
                dpi=dm.heightPixels+"";
            }catch(Exception e){
                e.printStackTrace();
            }  
        Log.i("屏幕总高度",dpi);
        int[] position = new int[2];
        //view所在的Y坐标
        lv.getLocationInWindow(position);
        System.out.println("getLocationOnScreen:" + position[0] + "," + position[1]);
    	height=getWindowManager().getDefaultDisplay().getHeight();
    	Rect outRect=new Rect();
    	getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
    	int statusBarHeight=outRect.top;
    	Log.i("状态栏高度",statusBarHeight+"");
    	int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
    	Log.i("标题栏的高度",contentTop-statusBarHeight+"");
    	int contentheight=getWindow().findViewById(Window.ID_ANDROID_CONTENT).getHeight();
    	Log.i("状态栏和标题栏的总高度",contentTop+"");
    	Log.i("除去状态栏和标题栏的高度",contentheight+"");
    	tv_height=lv.getHeight();
    	int tv_yheight=position[1]-contentTop+tv_height/2;
    	Log.i("Lv自身的高度",tv_height+"");
    	Log.i("Lv所在位置的高度",tv_yheight+"");
    	int hei=contentheight/2-tv_yheight;
    	Log.i("除去虚拟按键屏幕的高度",height+"");
    	Log.i("虚拟按键的高度",dm.heightPixels-height+"");
    	ObjectAnimator.ofFloat(lv, "translationY", 0,hei).setDuration(600).start();
    }
}
XML:

<RelativeLayout 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: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="com.jim.nineoldanim.MainActivity" >

    <LinearLayout
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:orientation="vertical"
        android:background="#ffdd11"
        android:id="@+id/lv"
        android:layout_centerHorizontal="true">
</LinearLayout>
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv"
        android:layout_marginTop="110dp"
        android:layout_toRightOf="@+id/tv"
        android:text="Button" 
        android:onClick="click"/>

</RelativeLayout>

打包下载

原理的6.控件的Y坐标有点错误,应该是6+1+2的总长才是,修改一下。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值