1

中心から右に 100 dp になるように、プログラムで ImageView を RelativeLayout に追加する必要があります。特定の画面サイズと解像度でこれを行いましたが、どのサイズの電話と密度でも動作するようにしたいと考えています。私がこれのために試したことは次のとおりです:

コード :

    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 で取得しましたが、正しいポイントを取得していません。どんな助けでも素晴らしいでしょう。

4

1 に答える 1

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;

TitleBar と StatusBar を含む画面サイズを返しますが、イメージをプロットすると、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);

そうすることで, Relative レイアウトを参照して画像をプロットするので, ハンドラを削除することができます.

于 2013-01-22T12:04:03.057 に答える