如何使任何屏幕都适合?

时间:2016-06-29 22:03:20

标签: android screen pixel percentage

我正在使用此应用:

它每秒都会获得一次速度更新。当速度为120 km/h时,我希望幸福的脸(ImageView)位于顶部,当速度为-120 km/h时,它应位于底部。 0 km/h将成为每个速度的中心等等。

Speed Bar

我计算了km / h和像素之间的关系并像这样移动脸部:

float pxSpeedFloat = -4.375 * speed + 115;
faceImageView.setY( -pxSpeedFloat);

setY(115)是条形图的中心,此等式适用于Xperia Z1.

问题是它只适用于此屏幕分辨率,它不适合其他手机。

根据文档,setY只允许以像素为单位的值,而不是屏幕的百分比。

我该如何解决?

3 个答案:

答案 0 :(得分:0)

尝试乘以屏幕密度

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

faceImageView.setY(-pxSpeedFloat * metrics.density);

答案 1 :(得分:0)

您可以使用此代码获取屏幕高度:

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int deviceHeight = displaymetrics.heightPixels;

那么你可以从那里开始。此代码将ImageView定位在屏幕底部:

imageView.setY(deviceHeight - imageView.getHeight())

此代码将垂直居中

imageView.setY((deviceHeight * 0.5) - (imageView.getHeight() * 0.5))

答案 2 :(得分:0)

Okey我使用了FrameLayout并测量了它的高度。我不知道如果它有效的方式,但它的工作,也许你可以使用AsyncTask,实际上它5am在这里,我有一个考试。所以尝试了这个并且工作完美。您也可以尝试并提供结果,这可能会解决您的问题,或者我会在考试后查看它。

1)你的全局变量:

FrameLayout frameLayout;
int layoutheight;
float MAX_SPEED=120;
float MIN_SPEED=-120;
float NEUTRAL_SPEED=0;
float speed;

2)在onCreate中,重点在于:getwidth-and-getheight-of-view

image=(ImageButton)findViewById(R.id.icon);

frameLayout =(FrameLayout) findViewById(R.id.frame);
frameLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //when layout ready for measuring height
            //you must wait this
            frameLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            layoutheight= frameLayout.getHeight()/2; //height is ready
            Toast.makeText(getApplicationContext(),"height : "+layoutheight,Toast.LENGTH_LONG).show();
            measureSpeed(-100);

        }
    });

3)您的measureSpeed方法:

public void measureSpeed(int speed){
    //if speed equals 0
    if(speed==NEUTRAL_SPEED){
        FrameLayout.LayoutParams params=new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity= Gravity.CENTER;
        image.setLayoutParams(params);
    }
    //if speed equals or less than -120
    else if(speed<=MIN_SPEED){
        FrameLayout.LayoutParams params=new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity=Gravity.BOTTOM;
        image.setLayoutParams(params);
    }
    //if speed equals or greater than 120
    else if(speed>=MAX_SPEED){
        FrameLayout.LayoutParams params=new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity=Gravity.TOP;
        image.setLayoutParams(params);
    }
    //otherwise
    else{
        if(speed<NEUTRAL_SPEED){
            //less than zero
            FrameLayout.LayoutParams params=new FrameLayout.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            params.gravity=Gravity.CENTER;
            float rate=speed/MIN_SPEED;
            float marginsize=layoutheight*rate;
            params.topMargin=(int) marginsize;
            image.setLayoutParams(params);

        }
        //greater than zero
        else if(speed>NEUTRAL_SPEED){
            FrameLayout.LayoutParams params=new FrameLayout.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            params.gravity=Gravity.CENTER;
            float rate=speed/MAX_SPEED;
            float marginsize=layoutheight*rate;
            params.bottomMargin=(int) marginsize;
            image.setLayoutParams(params);
        }
    }
}

4)示例xml结构:

<FrameLayout
  android:layout_width="wrap_content"
  android:id="@+id/frame"
  android:layout_height="match_parent">
<ImageView
  android:layout_width="match_parent"
  android:src="@drawable/desert"
  android:scaleType="fitXY"
  android:id="@+id/backimage"
  android:layout_height="match_parent" />
<ImageButton
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:id="@+id/icon"
  android:layout_gravity="top"
  android:src="@drawable/ic_clear_black_24dp"/>
</FrameLayout>