我正在使用此应用:
它每秒都会获得一次速度更新。当速度为120 km/h
时,我希望幸福的脸(ImageView
)位于顶部,当速度为-120 km/h
时,它应位于底部。 0 km/h
将成为每个速度的中心等等。
我计算了km / h和像素之间的关系并像这样移动脸部:
float pxSpeedFloat = -4.375 * speed + 115;
faceImageView.setY( -pxSpeedFloat);
setY(115)
是条形图的中心,此等式适用于Xperia Z1.
问题是它只适用于此屏幕分辨率,它不适合其他手机。
根据文档,setY
只允许以像素为单位的值,而不是屏幕的百分比。
我该如何解决?
答案 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>