Как создать макет с 8 кнопками вокруг центральной кнопки в Android

#android #android-layout #android-linearlayout

#Android #android-layout #android-linearlayout

Вопрос:

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

Как я могу создать макет, подобный этому, который я создал с использованием weight, но вывод не соответствует моим ожиданиям. У меня также есть 3 кнопки по горизонтали внизу экрана. я добавил пример кода для первой строки. пожалуйста, помогите мне достичь этого.

 <LinearLayout
        android:layout_width="match_parent"
        android:id="@ id/demo_l1"
        android:layout_centerInParent="true"
        android:orientation="vertical"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:weightSum="4"
            android:layout_height="wrap_content">

            <ImageView
                android:layout_weight="1"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
            <ImageView
                android:layout_weight="1"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
            <ImageView
                android:layout_weight="1"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

            <ImageView
                android:layout_weight="1"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />            </LinearLayout>
  

Комментарии:

1. Вы можете использовать библиотеку колес .

2. вы можете попробовать использовать RelativeLayout или sub sub LinearLayout

3. @AdityaVyas-Lakhan я проверю это.

4. @ravi_koriya проверьте отредактированный ответ

Ответ №1:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal">
        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:background="#000000"/>
        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:background="#000000"/>
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:background="#000000"/>
        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:background="#000000"/>
    </LinearLayout>
    <ImageView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_margin="10dp"
        android:layout_gravity="center"
        android:background="#000000"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:background="#000000"/>
        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="10dp"
            android:background="#000000"/>
    </LinearLayout>
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">
    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:background="#000000"/>
    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:background="#000000"/>
</LinearLayout>
  

Комментарии:

1. @ravi_koriya, вы можете следовать этому, если используете LinearLayout с sub sub

2. @sodiq я могу, но как это возможно для поддержки нескольких экранов, таких как xxhdpi, xxxhdpi и hdpi

3. создать отдельный dimen.xml для нескольких экранов.

4. @dheerubhaiBansal можете ли вы предложить мне несколько демонстраций для другого экрана поддержки

5. @ravi_koriya, да, это возможно. вы можете создать отдельные размеры для своей ширины и высоты для любого типа экрана, который вы хотите

Ответ №2:

Просто попробуйте этот способ, это именно то, что вы ищете

  <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:fitsSystemWindows="true"
    android:orientation="vertical">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="5dp"
        android:visibility="visible">



        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_marginBottom="10dp"
                android:layout_weight="1.0"
                android:gravity="right|bottom"
                android:orientation="vertical">





                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="F"

                    android:src="@mipmap/ic_launcher" />



            </LinearLayout>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_marginTop="5dp"
                android:layout_weight="1.0"
                android:gravity="top|right"
                android:orientation="vertical">

                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="E"

                    android:src="@mipmap/ic_launcher" />
            </LinearLayout>

        </LinearLayout>



        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="vertical">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1.0"
                android:gravity="bottom|center"
                android:orientation="horizontal">

                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="A"
                    android:src="@mipmap/ic_launcher" />
                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="A"
                    android:src="@mipmap/ic_launcher" />



            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/menu_marging_pading_20pd"
                android:gravity="center"
                android:orientation="vertical">

                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="G"

                    android:src="@mipmap/ic_launcher" />


            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1.0"
                android:gravity="center|top"
                android:orientation="horizontal">

                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="D"

                    android:src="@mipmap/ic_launcher" />
                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="A"
                    android:src="@mipmap/ic_launcher" />

            </LinearLayout>


        </LinearLayout>

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:gravity="center|center_vertical"
            android:orientation="vertical">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_marginBottom="@dimen/menu_marging_pading_10pd"
                android:layout_weight="1.0"
                android:gravity="start|bottom"
                android:orientation="vertical">

                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="B"

                    android:src="@mipmap/ic_launcher" />

            </LinearLayout>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_marginTop="5dp"
                android:layout_weight="1.0"
                android:gravity="start|top"
                android:orientation="vertical">

                <Button
                    android:layout_width="65dp"
                    android:layout_height="65dp"
                    android:padding="15dp"
                    android:text="C"

                    android:src="@mipmap/ic_launcher" />
            </LinearLayout>

        </LinearLayout>

    </LinearLayout>



</android.support.design.widget.CoordinatorLayout>
  

ВЫВОД

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

Комментарии:

1. да, это хорошо, но мне нужно 8 кнопок, так что не могли бы вы что-нибудь для этого сделать?

2. спасибо за ваш ответ, но это не так, как я ожидал.

3. я знаю это, но не волнуйтесь, я пробовал на основе примеров и спасибо за комментарий.

4. @ravi_koriya рад вам помочь ..Счастливого кодирования

Ответ №3:

Вот решение вашей проблемы

 <?xml version="1.0" encoding="utf-8"?>
  

 <ImageView
    android:id="@ id/center_view"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_centerInParent="true"
    android:background="@color/black" />


<View
    android:id="@ id/view_center_top"
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_above="@ id/center_view"
    android:layout_marginBottom="20dp" />


<View
    android:id="@ id/view_center_bottom"
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_below="@ id/center_view"
    android:layout_marginTop="20dp" />

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="130dp"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dp">

    <ImageView
        android:id="@ id/view_1"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_above="@ id/view_0_left"

        android:background="@color/black" />

    <View
        android:id="@ id/view_0_left"
        android:layout_width="5dp"
        android:layout_height="5dp"
        android:layout_centerVertical="true"
        android:background="@color/green" />

    <ImageView
        android:id="@ id/view_2"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_below="@ id/view_0_left"
        android:layout_centerVertical="true"
        android:background="@color/black" />
</RelativeLayout>


<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="130dp"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="10dp">

    <ImageView
        android:id="@ id/view_11"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_above="@ id/view_0_right"
        android:background="@color/black" />

    <View
        android:id="@ id/view_0_right"
        android:layout_width="5dp"
        android:layout_height="5dp"
        android:layout_centerVertical="true"
        android:background="@color/green" />

    <ImageView
        android:id="@ id/view_22"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_below="@ id/view_0_right"
        android:layout_centerVertical="true"
        android:background="@color/black" />
</RelativeLayout>

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@ id/view_center_top"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="5dp">

    <ImageView
        android:id="@ id/view_111"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/black" />

    <View
        android:layout_width="5dp"
        android:layout_height="5dp"
        android:background="@color/green" />

    <ImageView
        android:id="@ id/view_222"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/black" />
</LinearLayout>

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@ id/view_center_bottom"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="5dp">

    <ImageView
        android:id="@ id/view_1111"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/black" />

    <View
        android:layout_width="5dp"
        android:layout_height="5dp"
        android:background="@color/green" />

    <ImageView
        android:id="@ id/view_2222"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/black" />
</LinearLayout>
  

Комментарии:

1. я пробовал, но вывод не такой, как я ожидал, спасибо за ваш ответ

Ответ №4:

Этот код может вам помочь.

CircleLayout.java

 public class CircleLayout extends ViewGroup {
public enum FirstChildPosition {
    EAST(0), SOUTH(90), WEST(180), NORTH(270);

    private int angle;

    public int getAngle() {
        return angle;
    }

    FirstChildPosition(int angle) {
        this.angle = angle;
    }
}

// Event listeners
private OnItemClickListener onItemClickListener = null;
private OnItemSelectedListener onItemSelectedListener = null;
private OnCenterClickListener onCenterClickListener = null;
private OnRotationFinishedListener onRotationFinishedListener = null;

// Background image
private Bitmap originalBackground, scaledBackground;

// Sizes of the ViewGroup
private int circleWidth, circleHeight;
private float radius = 0;

// Child sizes
private int maxChildWidth = 0;
private int maxChildHeight = 0;

// Touch detection
private GestureDetector gestureDetector;
// Detecting inverse rotations
private boolean[] quadrantTouched;

// Settings of the ViewGroup
private int speed = 25;
private float angle = 55;
private FirstChildPosition firstChildPosition = FirstChildPosition.SOUTH;
private boolean isRotating = true;

// Tapped and selected child
private View selectedView = null;

// Rotation animator
private ObjectAnimator animator;

public CircleLayout(Context context) {
    this(context, null);
}

public CircleLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public CircleLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(attrs);
}

/**
 * Initializes the ViewGroup and modifies it's default behavior by the
 * passed attributes
 *
 * @param attrs the attributes used to modify default settings
 */
protected void init(AttributeSet attrs) {
    gestureDetector = new GestureDetector(getContext(),
            new MyGestureListener());
    quadrantTouched = new boolean[]{false, false, false, false, false};

    if (attrs != null) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CircleLayout);


        speed = a.getInt(R.styleable.CircleLayout_speed, speed);
        isRotating = a.getBoolean(R.styleable.CircleLayout_isRotating, isRotating);

        // The angle where the first menu item will be drawn
        angle = a.getInt(R.styleable.CircleLayout_firstChildPosition, (int) angle);
        for (FirstChildPosition pos : FirstChildPosition.values()) {
            if (pos.getAngle() == angle) {
                firstChildPosition = pos;
                break;
            }
        }

        if (originalBackground == null) {
            int picId = a.getResourceId(R.styleable.CircleLayout_circleBackground, -1);

            // If a background image was set as an attribute,
            // retrieve the image
            if (picId != -1) {
                originalBackground = BitmapFactory.decodeResource(getResources(), picId);
            }
        }

        a.recycle();

        // Needed for the ViewGroup to be drawn
        setWillNotDraw(false);
    }
}

public float getAngle() {
    return angle;
}

public void setAngle(float angle) {
    this.angle = angle % 360;
    setChildAngles();
}

public int getSpeed() {
    return speed;
}

public void setSpeed(int speed) {
    if (speed <= 0) {
        throw new InvalidParameterException("Speed must be a positive integer number");
    }
    this.speed = speed;
}

public boolean isRotating() {
    return isRotating;
}

public void setRotating(boolean isRotating) {
    this.isRotating = isRotating;
}

public FirstChildPosition getFirstChildPosition() {
    return firstChildPosition;
}

public void setFirstChildPosition(FirstChildPosition firstChildPosition) {
    this.firstChildPosition = firstChildPosition;
    if (selectedView != null) {
        if (isRotating) {
            rotateViewToCenter(selectedView);
        } else {
            setAngle(firstChildPosition.getAngle());
        }
    }
}

/**
 * Returns the currently selected menu
 *
 * @return the view which is currently the closest to the first item
 * position
 */
public View getSelectedItem() {
    if (selectedView == null) {
        selectedView = getChildAt(0);
    }
    return selectedView;
}

@Override
public void removeView(View view) {
    super.removeView(view);
    updateAngle();
}

@Override
public void removeViewAt(int index) {
    super.removeViewAt(index);
    updateAngle();
}

@Override
public void removeViews(int start, int count) {
    super.removeViews(start, count);
    updateAngle();
}

@Override
public void addView(View child, int index, LayoutParams params) {
    super.addView(child, index, params);
    updateAngle();
}

private void updateAngle() {
    // Update the position of the views, so we know which is the selected
    setChildAngles();
    rotateViewToCenter(selectedView);
}

@Override
protected void onDraw(Canvas canvas) {
    // The sizes of the ViewGroup
    circleHeight = getHeight();
    circleWidth = getWidth();

    if (originalBackground != null) {
        // Scaling the size of the background image
        if (scaledBackground == null) {
            float diameter = radius * 2;
            float sx = diameter / originalBackground
                    .getWidth();
            float sy = diameter / originalBackground
                    .getHeight();

            Matrix matrix = new Matrix();
            matrix.postScale(sx, sy);

            scaledBackground = Bitmap.createBitmap(originalBackground, 0, 0,
                    originalBackground.getWidth(), originalBackground.getHeight(),
                    matrix, false);
        }

        if (scaledBackground != null) {
            // Move the background to the center
            int cx = (circleWidth - scaledBackground.getWidth()) / 2;
            int cy = (circleHeight - scaledBackground.getHeight()) / 2;

            canvas.drawBitmap(scaledBackground, cx, cy, null);
        }
    }
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // Measure child views first
    maxChildWidth = 0;
    maxChildHeight = 0;

    int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
            MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST);
    int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
            MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST);

    final int childCount = getChildCount();
    for (int i = 0; i < childCount; i  ) {
        final View child = getChildAt(i);
        if (child.getVisibility() == GONE) {
            continue;
        }

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);

        maxChildWidth = Math.max(maxChildWidth, child.getMeasuredWidth());
        maxChildHeight = Math.max(maxChildHeight, child.getMeasuredHeight());
    }

    // Then decide what size we want to be
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);

    int width;
    int height;

    //Measure Width
    if (widthMode == MeasureSpec.EXACTLY) {
        //Must be this size
        width = widthSize;
    } else if (widthMode == MeasureSpec.AT_MOST) {
        //Can't be bigger than...
        width = Math.min(widthSize, heightSize);
    } else {
        //Be whatever you want
        width = maxChildWidth * 3;
    }

    //Measure Height
    if (heightMode == MeasureSpec.EXACTLY) {
        //Must be this size
        height = heightSize;
    } else if (heightMode == MeasureSpec.AT_MOST) {
        //Can't be bigger than...
        height = Math.min(heightSize, widthSize);
    } else {
        //Be whatever you want
        height = maxChildHeight * 3;
    }

    setMeasuredDimension(resolveSize(width, widthMeasureSpec),
            resolveSize(height, heightMeasureSpec));
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    int layoutWidth = r - l;
    int layoutHeight = b - t;

    radius = (layoutWidth <= layoutHeight) ? layoutWidth / 3
            : layoutHeight / 3;
    radius = radius - 20;
    circleHeight = getHeight();
    circleWidth = getWidth();
    setChildAngles();
}

/**
 * Rotates the given view to the firstChildPosition
 *
 * @param view the view to be rotated
 */
private void rotateViewToCenter(View view) {
    if (isRotating) {
        float viewAngle = view.getTag() != null ? (Float) view.getTag() : 0;
        float destAngle = (firstChildPosition.getAngle() - viewAngle);

        if (destAngle < 0) {
            destAngle  = 360;
        }

        if (destAngle > 180) {
            destAngle = -1 * (360 - destAngle);
        }

        animateTo(angle   destAngle, 7500 / speed);
    }
}

private void rotateButtons(float degrees) {
    angle  = degrees;
    setChildAngles();
}

private void setChildAngles() {
    int left, top, childWidth, childHeight, childCount = getChildCount();
    float angleDelay = 360.0f / childCount;
    float halfAngle = angleDelay / 2;
    float localAngle = angle;

    for (int i = 0; i < childCount; i  ) {
        final View child = getChildAt(i);
        if (child.getVisibility() == GONE) {
            continue;
        }

        if (localAngle > 360) {
            localAngle -= 360;
        } else if (localAngle < 0) {
            localAngle  = 360;
        }

        childWidth = child.getMeasuredWidth();
        childHeight = child.getMeasuredHeight();
        left = Math
                .round((float) (((circleWidth / 2.0) - childWidth / 2.0)   radius
                        * Math.cos(Math.toRadians(localAngle))));
        top = Math
                .round((float) (((circleHeight / 2.0) - childHeight / 2.0)   radius
                        * Math.sin(Math.toRadians(localAngle))));

        child.setTag(localAngle);

        float distance = Math.abs(localAngle - firstChildPosition.getAngle());
        boolean isFirstItem = distance <= halfAngle || distance >= (360 - halfAngle);
        if (isFirstItem amp;amp; selectedView != child) {
            selectedView = child;
            if (onItemSelectedListener != null amp;amp; isRotating) {
                onItemSelectedListener.onItemSelected(child);
            }
        }

        child.layout(left, top, left   childWidth, top   childHeight);
        localAngle  = angleDelay;
    }
}

private void animateTo(float endDegree, long duration) {
    if (animator != null amp;amp; animator.isRunning() || Math.abs(angle - endDegree) < 1) {
        return;
    }

    animator = ObjectAnimator.ofFloat(CircleLayout.this, "angle", angle, endDegree);
    animator.setDuration(duration);
    animator.setInterpolator(new DecelerateInterpolator());
    animator.addListener(new Animator.AnimatorListener() {
        private boolean wasCanceled = false;

        @Override
        public void onAnimationStart(Animator animation) {
        }

        @Override
        public void onAnimationRepeat(Animator animation) {
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            if (wasCanceled) {
                return;
            }

            if (onRotationFinishedListener != null) {
                View view = getSelectedItem();
                onRotationFinishedListener.onRotationFinished(view);
            }
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            wasCanceled = true;
        }
    });
    animator.start();
}

private void stopAnimation() {
    if (animator != null amp;amp; animator.isRunning()) {
        animator.cancel();
        animator = null;
    }
}

/**
 * @return The angle of the unit circle with the image views center
 */
private double getPositionAngle(double xTouch, double yTouch) {
    double x = xTouch - (circleWidth / 2d);
    double y = circleHeight - yTouch - (circleHeight / 2d);

    switch (getPositionQuadrant(x, y)) {
        case 1:
            return Math.asin(y / Math.hypot(x, y)) * 180 / Math.PI;
        case 2:
        case 3:
            return 180 - (Math.asin(y / Math.hypot(x, y)) * 180 / Math.PI);
        case 4:
            return 360   Math.asin(y / Math.hypot(x, y)) * 180 / Math.PI;
        default:
            // ignore, does not happen
            return 0;
    }
}

/**
 * @return The quadrant of the position
 */
private static int getPositionQuadrant(double x, double y) {
    if (x >= 0) {
        return y >= 0 ? 1 : 4;
    } else {
        return y >= 0 ? 2 : 3;
    }
}

// Touch helpers
private double touchStartAngle;
private boolean didMove = false;

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (isEnabled()) {
        gestureDetector.onTouchEvent(event);
        if (isRotating) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    // reset the touched quadrants
                    for (int i = 0; i < quadrantTouched.length; i  ) {
                        quadrantTouched[i] = false;
                    }

                    stopAnimation();
                    touchStartAngle = getPositionAngle(event.getX(),
                            event.getY());
                    didMove = false;
                    break;
                case MotionEvent.ACTION_MOVE:
                    double currentAngle = getPositionAngle(event.getX(),
                            event.getY());
                    rotateButtons((float) (touchStartAngle - currentAngle));
                    touchStartAngle = currentAngle;
                    didMove = true;
                    break;
                case MotionEvent.ACTION_UP:
                    if (didMove) {
                        rotateViewToCenter(selectedView);
                    }
                    break;
            }
        }

        // set the touched quadrant to true
        quadrantTouched[getPositionQuadrant(event.getX()
                - (circleWidth / 2), circleHeight - event.getY()
                - (circleHeight / 2))] = true;
        return true;
    }
    return false;
}

private class MyGestureListener extends SimpleOnGestureListener {

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (!isRotating) {
            return false;
        }
        // get the quadrant of the start and the end of the fling
        int q1 = getPositionQuadrant(e1.getX() - (circleWidth / 2),
                circleHeight - e1.getY() - (circleHeight / 2));
        int q2 = getPositionQuadrant(e2.getX() - (circleWidth / 2),
                circleHeight - e2.getY() - (circleHeight / 2));

        if ((q1 == 2 amp;amp; q2 == 2 amp;amp; Math.abs(velocityX) < Math
                .abs(velocityY))
                || (q1 == 3 amp;amp; q2 == 3)
                || (q1 == 1 amp;amp; q2 == 3)
                || (q1 == 4 amp;amp; q2 == 4 amp;amp; Math.abs(velocityX) > Math
                .abs(velocityY))
                || ((q1 == 2 amp;amp; q2 == 3) || (q1 == 3 amp;amp; q2 == 2))
                || ((q1 == 3 amp;amp; q2 == 4) || (q1 == 4 amp;amp; q2 == 3))
                || (q1 == 2 amp;amp; q2 == 4 amp;amp; quadrantTouched[3])
                || (q1 == 4 amp;amp; q2 == 2 amp;amp; quadrantTouched[3])) {
            // the inverted rotations
            animateTo(
                    getCenteredAngle(angle - (velocityX   velocityY) / 25),
                    25000 / speed);
        } else {
            // the normal rotation
            animateTo(
                    getCenteredAngle(angle   (velocityX   velocityY) / 25),
                    25000 / speed);
        }

        return true;
    }

    private float getCenteredAngle(float angle) {
        if (getChildCount() == 0) {
            // Prevent divide by zero
            return angle;
        }

        float angleDelay = 360 / getChildCount();
        float localAngle = angle % 360;

        if (localAngle < 0) {
            localAngle = 360   localAngle;
        }

        for (float i = firstChildPosition.getAngle(); i < firstChildPosition.getAngle()   360; i  = angleDelay) {
            float locI = i % 360;
            float diff = localAngle - locI;
            if (Math.abs(diff) < angleDelay) {
                angle -= diff;
                break;
            }
        }

        return angle;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        View tappedView = null;
        int tappedViewsPosition = pointToChildPosition(e.getX(), e.getY());
        if (tappedViewsPosition >= 0) {
            tappedView = getChildAt(tappedViewsPosition);
            tappedView.setPressed(true);
        } else {
            // Determine if it was a center click
            float centerX = circleWidth / 2;
            float centerY = circleHeight / 2;

            if (onCenterClickListener != null
                    amp;amp; e.getX() < centerX   radius - (maxChildWidth / 2)
                    amp;amp; e.getX() > centerX - radius   (maxChildWidth / 2)
                    amp;amp; e.getY() < centerY   radius - (maxChildHeight / 2)
                    amp;amp; e.getY() > centerY - radius   (maxChildHeight / 2)) {
                onCenterClickListener.onCenterClick();
                return true;
            }
        }

        if (tappedView != null) {
            if (selectedView == tappedView) {
                if (onItemClickListener != null) {
                    onItemClickListener.onItemClick(tappedView);
                }
            } else {
                rotateViewToCenter(tappedView);
                if (!isRotating) {
                    if (onItemSelectedListener != null) {
                        onItemSelectedListener.onItemSelected(tappedView);
                    }

                    if (onItemClickListener != null) {
                        onItemClickListener.onItemClick(tappedView);
                    }
                }
            }
            return true;
        }
        return super.onSingleTapUp(e);
    }

    private int pointToChildPosition(float x, float y) {
        for (int i = 0; i < getChildCount(); i  ) {
            View view = getChildAt(i);
            if (view.getLeft() < x amp;amp; view.getRight() > x
                    amp; view.getTop() < y amp;amp; view.getBottom() > y) {
                return i;
            }
        }
        return -1;
    }
}

public interface OnItemClickListener {
    void onItemClick(View view);
}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

public interface OnItemSelectedListener {
    void onItemSelected(View view);
}

public void setOnItemSelectedListener(
        OnItemSelectedListener onItemSelectedListener) {
    this.onItemSelectedListener = onItemSelectedListener;
}

public interface OnCenterClickListener {
    void onCenterClick();
}

public void setOnCenterClickListener(
        OnCenterClickListener onCenterClickListener) {
    this.onCenterClickListener = onCenterClickListener;
}

public interface OnRotationFinishedListener {
    void onRotationFinished(View view);
}

public void setOnRotationFinishedListener(
        OnRotationFinishedListener onRotationFinishedListener) {
    this.onRotationFinishedListener = onRotationFinishedListener;
}
}
  

поместите это в свой XML-файл layout

 <[YOUR PACKAGE NAME].CircleLayout
    android:id="@ id/circle_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:layout_centerInParent="true"
    app:isRotating="false">

    <include layout="@layout/dashboard_options" />

</[YOUR PACKAGE NAME].CircleLayout>
  

values/attrs.xml

 <?xml version="1.0" encoding="utf-8"?>
<resources>

<declare-styleable name="CircleLayout">
    <attr name="circleBackground" format="reference" />
    <attr name="isRotating" format="boolean" />
    <attr name="speed" format="integer" />
    <attr name="firstChildPosition">
        <enum name="East" value="0" />
        <enum name="South" value="90" />
        <enum name="West" value="180" />
        <enum name="North" value="270" />
    </attr>
</declare-styleable>

<declare-styleable name="CircleImageView">
    <attr name="name" format="string" />
</declare-styleable>

</resources>
  

layout/dashboard_options.xml

 <?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</merge>
  

Комментарии:

1. я проверю это и попробую.

Ответ №5:

вы можете использовать этот макет

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <LinearLayout
        android:id="@ id/demo_l1"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="5dp"
            android:orientation="horizontal"
            android:weightSum="4">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

                <ImageView
                    android:layout_width="50dp"
                    android:layout_height="match_parent"
                    android:background="#000000" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

                <ImageView
                    android:layout_width="50dp"
                    android:layout_height="match_parent"
                    android:background="#000000" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

            </LinearLayout>


        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="5dp"
            android:orientation="horizontal"
            android:weightSum="4">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                android:weightSum="2">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical"
                    android:paddingBottom="5dp"
                    android:paddingTop="5dp">

                    <ImageView
                        android:layout_width="50dp"
                        android:layout_height="50dp"
                        android:background="#000000" />

                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical"
                    android:paddingBottom="5dp"
                    android:paddingTop="5dp">

                    <ImageView
                        android:layout_width="50dp"
                        android:layout_height="50dp"
                        android:background="#000000" />

                </LinearLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:gravity="center"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                android:weightSum="1">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical"
                    android:paddingBottom="5dp"
                    android:paddingTop="5dp">

                    <ImageView
                        android:layout_width="130dp"
                        android:layout_height="130dp"
                        android:background="#000000" />

                </LinearLayout>

            </LinearLayout>


            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                android:weightSum="2">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical"
                    android:paddingBottom="5dp"
                    android:paddingTop="5dp">

                    <ImageView
                        android:layout_width="50dp"
                        android:layout_height="50dp"
                        android:background="#000000" />

                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:orientation="vertical"
                    android:paddingBottom="5dp"
                    android:paddingTop="5dp">

                    <ImageView
                        android:layout_width="50dp"
                        android:layout_height="50dp"
                        android:background="#000000" />

                </LinearLayout>

            </LinearLayout>


        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="5dp"
            android:orientation="horizontal"
            android:weightSum="4">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

                <ImageView
                    android:layout_width="50dp"
                    android:layout_height="match_parent"
                    android:background="#000000" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

                <ImageView
                    android:layout_width="50dp"
                    android:layout_height="match_parent"
                    android:background="#000000" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

            </LinearLayout>


        </LinearLayout>

    </LinearLayout>

</LinearLayout>
  

это даст такой результат

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

Ответ №6:

наконец-то я создал его, спасибо за поддержку.

     <LinearLayout
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_margin="@dimen/layout_default_margin"
            android:layout_height="wrap_content">
                <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:weightSum="5">

                    <View
                        android:layout_width="1dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"/>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:orientation="horizontal"
                        android:layout_height="wrap_content"
                        android:layout_weight="3">

                        <LinearLayout
                            android:layout_width="0dp"
                            android:layout_margin="@dimen/normal_margin"
                            android:layout_height="match_parent"
                            android:layout_weight="1" >
                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent">

                                <ImageView
                                    android:layout_width="80dp"
                                    android:layout_centerInParent="true"
                                    android:layout_height="80dp" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:text="1"
                                    android:layout_centerInParent="true"
                                    android:textColor="@android:color/black"
                                    android:textSize="40sp"
                                    android:gravity="center_horizontal|center_vertical"/>

                            </RelativeLayout>

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="0dp"
                            android:layout_margin="@dimen/normal_margin"
                            android:layout_height="match_parent"
                            android:layout_weight="1" >

                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent">

                                <ImageView
                                    android:layout_width="80dp"
                                    android:layout_centerInParent="true"
                                    android:layout_height="80dp" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:text="2"
                                    android:layout_centerInParent="true"
                                    android:textColor="@android:color/black"
                                    android:textSize="40sp"
                                    android:gravity="center_horizontal|center_vertical"/>

                            </RelativeLayout>
                        </LinearLayout>
                    </LinearLayout>
                    <View
                        android:layout_width="1dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"/>
                </LinearLayout>
                <LinearLayout
                    android:baselineAligned="false"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:weightSum="5">

                    <LinearLayout
                        android:layout_width="0dp"
                        android:orientation="vertical"
                        android:layout_height="wrap_content"
                        android:layout_weight="1.3">

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_margin="@dimen/normal_margin"
                            android:layout_height="0dp"
                            android:layout_weight="1" >

                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent">

                                <ImageView
                                    android:layout_width="80dp"
                                    android:layout_centerInParent="true"
                                    android:layout_height="80dp" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:text="3"
                                    android:layout_centerInParent="true"
                                    android:textColor="@android:color/black"
                                    android:textSize="40sp"
                                    android:gravity="center_horizontal|center_vertical"/>

                            </RelativeLayout>
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_margin="@dimen/normal_margin"
                            android:layout_height="0dp"
                            android:layout_weight="1" >

                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent">

                                <ImageView
                                    android:layout_width="80dp"
                                    android:layout_centerInParent="true"
                                    android:layout_height="80dp" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:text="5"
                                    android:layout_centerInParent="true"
                                    android:textColor="@android:color/black"
                                    android:textSize="40sp"
                                    android:gravity="center_horizontal|center_vertical"/>

                            </RelativeLayout>
                        </LinearLayout>

                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:orientation="horizontal"
                        android:layout_height="match_parent"
                        android:layout_weight="2.4"/>


                    <LinearLayout
                        android:layout_width="0dp"
                        android:orientation="vertical"
                        android:layout_height="wrap_content"
                        android:layout_weight="1.3">

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_margin="@dimen/normal_margin"
                            android:layout_height="0dp"
                            android:layout_weight="1" >

                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent">

                                <ImageView
                                    android:layout_width="80dp"
                                    android:layout_centerInParent="true"
                                    android:layout_height="80dp" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:text="4"
                                    android:layout_centerInParent="true"
                                    android:textColor="@android:color/black"
                                    android:textSize="40sp"
                                    android:gravity="center_horizontal|center_vertical"/>

                            </RelativeLayout>

                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_margin="@dimen/normal_margin"
                            android:layout_height="0dp"
                            android:layout_weight="1" >

                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent">

                                <ImageView
                                    android:layout_width="80dp"
                                    android:layout_centerInParent="true"
                                    android:layout_height="80dp" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:text="6"
                                    android:layout_centerInParent="true"
                                    android:textColor="@android:color/black"
                                    android:textSize="40sp"
android:gravity="center_horizontal|center_vertical"/>
                            </RelativeLayout>
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>
                <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:weightSum="5">

                    <View
                        android:layout_width="1dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"/>

                    <LinearLayout
                        android:layout_width="0dp"
                        android:orientation="horizontal"
                        android:layout_height="wrap_content"
                        android:layout_weight="3">

                        <LinearLayout
                            android:layout_width="0dp"
                            android:layout_margin="@dimen/normal_margin"
                            android:layout_height="match_parent"
                            android:layout_weight="1" >

                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent">

                                <ImageView
                                    android:layout_width="80dp"

                                    android:layout_centerInParent="true"
                                    android:layout_height="80dp" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:text="7"
                                    android:layout_centerInParent="true"
                                    android:textColor="@android:color/black"
                                    android:textSize="40sp"
                                    android:gravity="center_horizontal|center_vertical"/>

                            </RelativeLayout>
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="0dp"
                            android:layout_margin="@dimen/normal_margin"
                            android:layout_height="match_parent"
                            android:layout_weight="1" >

                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent">

                                <ImageView
                                    android:layout_width="80dp"

                                    android:layout_centerInParent="true"
                                    android:layout_height="80dp" />

                                <TextView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:text="8"
                                    android:layout_centerInParent="true"
                                    android:textColor="@android:color/black"
                                    android:textSize="40sp"
                                    android:gravity="center_horizontal|center_vertical"/>
                            </RelativeLayout>
                        </LinearLayout>
                    </LinearLayout>

                    <View
                        android:layout_width="1dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"/>
                </LinearLayout>
        </LinearLayout>