#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>