1

我必須以編程方式將ImageView添加到RelativeLayout,使其位於中心右側100dp。我爲了一個特定的屏幕尺寸和分辨率做了這個,但我希望它能適用於任何尺寸的手機和平板電腦。我試過這個如下:獲取屏幕的中心線並根據它對齊視圖

CODE:

float xCord, yCord; 
    float xCenter, yCenter; 
    float radius; 
    float angle; 
    double x, y; 

    TextView tv; 
    RelativeLayout container; 
    ImageView view; 
    RelativeLayout.LayoutParams viewParams; 
    DisplayMetrics metrics ; 
    float density; 
    int dps,pxs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.activity_circular_animation); 

     metrics = getApplicationContext().getResources().getDisplayMetrics(); 
     float width = metrics.widthPixels; 
     float height = metrics.heightPixels; 



     tv = (TextView)findViewById(R.id.tv); 
     container = (RelativeLayout)findViewById(R.id.container); 

     xCenter = convertToDP(width)/2; 
     yCenter = convertToDP(height)/2; 
     radius = 100; 
     angle = 0; 

     x = xCenter + radius * Math.cos(angle * Math.PI/180); 
     y = yCenter + radius * Math.sin(angle * Math.PI/180); 

     view = new ImageView(this); 
     viewParams = new RelativeLayout.LayoutParams(50,50); 
     viewParams.leftMargin = (int) x; 
     viewParams.topMargin = (int) y; 
     view.setLayoutParams(viewParams); 
     view.setImageResource(R.drawable.square); 
     container.addView(view); 

     tv.setText(String.valueOf(xCenter) + " " + String.valueOf(yCenter)); 
    } 

    public int convertToDP(float px) { 

     density = getApplicationContext().getResources().getDisplayMetrics().density;  
     dps = (int) ((px/density) + 0.5f); 
     return dps; 
    } 

} 

我所做的是什麼樣的,讓屏幕大小和密度,然後除以2得到中央線。一旦我有繩索,我用公式來獲得0deg圓周上的點,但我沒有得到正確的觀點。任何幫助都會很棒。

+0

你想把圖像放在圓圈上還是隻放100dp到中心 –

+0

我想把它們放置成100dp或200dp任何東西(userinput)關於他/她屏幕的中心。如果用戶輸入是X:200和Y:400,半徑:100,角度:50,那麼應該通過x = xCenter + radius * Math.cos(angle * Math.PI/180)獲得簾線。 y = yCenter + radius * Math.sin(angle * Math.PI/180); 這裏xCenter和yCenter是屏幕中心點的簾線。 – ark

+0

這是一個循環路徑,如果這就是你要求的。 – ark

回答

0

試試這個:

public class sampleMediaPlayer extends Activity { 
    // Toast mToast; 
    // int i = 0; 
    // private boolean click; 
    // private Camera camera; 
    Handler mHandler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_mainf); 

    } 

    @Override 
    protected void onResume() { 

     mHandler.postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout); 

       float r = DPtoPX(100); 
       float mScreenWidth = rl.getWidth()/2; // DPtoPX(100); 
       float mScreenHeight = rl.getHeight()/2;// DPtoPX(100); 

       for (int i = 0; i < 360; i = i + 30) { 
        addView(rl, (int) (mScreenWidth + r * Math.cos(i * Math.PI/180F)), 
          (int) (mScreenHeight + (int) r * Math.sin(i * Math.PI/180F))); 

       } 

       addView(rl, (int) mScreenWidth, (int) ((mScreenHeight))); 

      } 
     }, 50); 

     super.onResume(); 
    } 

    void addView(ViewGroup rl, int x, int y) { 
     Log.i("NIMISH", x + " = " + y); 
     ImageView CenterImage = new ImageView(this); 
     RelativeLayout.LayoutParams viewParamsCenter = new RelativeLayout.LayoutParams(10, 10); 
     // viewParamsCenter.addRule(RelativeLayout.CENTER_IN_PARENT); 
     viewParamsCenter.leftMargin = x; 
     viewParamsCenter.topMargin = y; 
     CenterImage.setLayoutParams(viewParamsCenter); 
     CenterImage.setImageResource(R.drawable.ic_launcher); 

     rl.addView(CenterImage); 
    } 

    float DPtoPX(float dp) { 
     Resources r = getResources(); 
     return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()); 
    } 
} 

說明:

float width = metrics.widthPixels; 
    float height = metrics.heightPixels; 

返回屏幕尺寸,包括標題欄和狀態欄,但是當你繪製圖像它計算出相對的RelativeLayout的的。因此,如果您使用高度「metrics.heightPixels」繪製圖像,則您將觀察圖像超出屏幕。這種現象影響真正中心的計算。

還有一些其他的計算方法,但每個方法都需要在屏幕上繪製視圖。因此,onResume()(使用處理程序)後的任何調用。正如你所看到的,當調用窗體onResume()時,計算標題欄高度的函數返回0。

private float Correction() { 
    Rect rectgle = new Rect(); 
    Window window = getWindow(); 
    window.getDecorView().getWindowVisibleDisplayFrame(rectgle); 
    int StatusBarHeight = rectgle.top; 
    int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
    int TitleBarHeight = contentViewTop - StatusBarHeight; 

    Log.i("NIMISH", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight); 
    return contentViewTop; 
} 

如果你想用戶輸入X,Y協調可以通過

float mScreenWidth = DPtoPX(100); 
float mScreenHeight = DPtoPX(100); 

這樣做改變的第一個程序,它將繪製圖像參照相對佈局,這樣你就可以刪除處理程序。

相關問題