2016-06-29 15 views
0

私はこのアプリで働いています:どの画面にどのようにフィットするの?

毎秒速度の更新を取得します。速度が120 km/hのときは、幸せな顔(ImageView)が上部に表示され、速度が-120 km/hのときは、下部に表示されます。 0 km/hはすべてのスピードの中心となるでしょう。

Speed Bar

Iはキロ/ H画素betweeen関係を算出し、このような顔を動かす:

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

setY(115)はバーの中心であり、この式はXperia Z1.

に正常に動作し

問題は、この画面解像度でのみ機能し、他の携帯電話には適合しないということです。

ドキュメントによると、setYは、画面の%ではなく、ピクセル単位で値を許可します。

どうすれば解決できますか?

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

次に、あなただけのものから、あなたのように仕事ができる:

+0

スピードとピクセルの関係を掲載できますか? –

+2

-120Km/hはどのように行くのですか? – Razgriz

+0

@Razgrizさんは多分起源から家に帰るでしょうか? –

答えて

0

あなたは、画面の高さを取得するには、このコードを使用することができ、画面の密度によって

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

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

を乗算してみてください。私はFrameLayoutを使用し、その高さを測定し

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

そして、このコードは、垂直

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

これは、3つのポジションではうまくいくが、別のランダムポジションではうまくいかない。とにかく、ありがとう、多分私は何かで動作することができますデバイスの高さを知って... –

0

オーケー、それを中心になります。このコードは、画面の一番下にあなたのImageViewのを配置します。私はその効率的な方法だが、その仕事は多分AsyncTaskとそれを使用することができますkonw、実際にはその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> 
関連する問題