Подтвердить что ты не робот

Представления макета Android поворачиваются и разнесены по кругу?

Я пытаюсь выяснить способ разметки серию представлений вокруг круга, таким образом, чтобы каждое представление поворачивалось, чтобы быть обращенным наружу от круга. На картинке ниже представлен пример того, что я ищу. Внешний блок - это макет/группа просмотра, красные квадраты представляют виды, которые я хочу повернуть.

Rough Sketch of what I want to do

Я знаком с свойствами представления PivotX, PivotY и Rotation, и подозреваю, что я буду использовать их в некотором роде, но я не уверен, как использовать их в согласии с соответствующим макетом, чтобы получить желаемый эффект.

4b9b3361

Ответ 1

Вот пример, который делает это. Я создал новый проект для Android и заменил RelativeLayout, который уже существует, с FrameLayout. It >= API 11 только из-за перевода и поворота вызовов в View:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/hello_world" />
</FrameLayout>

Я создам несколько быстрых представлений в коде, просто замените их любыми видами, которые у вас есть. Я размещаю их все в центре макета, установив гравитацию их LayoutParams на Gravity.CENTER. Затем я переводю и поворачиваю их на правильные позиции:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final FrameLayout main = (FrameLayout)findViewById(R.id.main);

    int numViews = 8;
    for(int i = 0; i < numViews; i++)
    {
        // Create some quick TextViews that can be placed.
        TextView v = new TextView(this);
        // Set a text and center it in each view.
        v.setText("View " + i);
        v.setGravity(Gravity.CENTER);
        v.setBackgroundColor(0xffff0000);
        // Force the views to a nice size (150x100 px) that fits my display.
        // This should of course be done in a display size independent way.
        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(150, 100);
        // Place all views in the center of the layout. We'll transform them
        // away from there in the code below.
        lp.gravity = Gravity.CENTER;
        // Set layout params on view.
        v.setLayoutParams(lp);

        // Calculate the angle of the current view. Adjust by 90 degrees to
        // get View 0 at the top. We need the angle in degrees and radians.
        float angleDeg = i * 360.0f / numViews - 90.0f;
        float angleRad = (float)(angleDeg * Math.PI / 180.0f);
        // Calculate the position of the view, offset from center (300 px from
        // center). Again, this should be done in a display size independent way.
        v.setTranslationX(300 * (float)Math.cos(angleRad));
        v.setTranslationY(300 * (float)Math.sin(angleRad));
        // Set the rotation of the view.
        v.setRotation(angleDeg + 90.0f);
        main.addView(v);
    }
}

И это результат:

Image of 8 views in a circle

Ответ 2

Ответ @Даниэля велик.

Если вам нужна дополнительная функциональность, вы можете использовать эту симпатичную библиотеку в GitHub под названием Android-CircleMenu

введите описание изображения здесь