Android学习教程之圆形Menu菜单制作方法(1)

作者:天风隼 时间:2022-05-23 03:08:50 

本文实例为大家分享了Android圆形菜单的使用方法,供大家参考,具体内容如下

MainActivity.java代码:


package siso.handlerdemo;

import android.app.NotificationManager;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
 private Button btnStartService;
 private Button btnBro;
 private Button btnFile;
 private Button btnSR;
 private Button btnLv;
 private Button btnGv;
 private Button btnMth;
 private Button btnMultispinner;
 private Button btnMenu;
 private Button btnSlidemenu;

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

//-------------------------------------------------------------------------------
   btnStartService=(Button)findViewById(R.id.btnStartService);
   btnStartService.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, StatusService.class);
       startService(intent);
     }
   });
   //-------------------------------------------------------------------------------
   btnBro=(Button)findViewById(R.id.btnRb);
   btnBro.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, BRActivity.class);
       startActivity(intent);
     }
   });
   //-------------------------------------------------------------------------------
   btnFile=(Button)findViewById(R.id.btnFile);
   btnFile.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, FileActivity.class);
       startActivity(intent);
     }
   });
   //-------------------------------------------------------------------------------
   btnSR=(Button)findViewById(R.id.btnSR);
   btnSR.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, SharedpActivity.class);
       startActivity(intent);
     }
   });
   //-------------------------------------------------------------------------------
   btnLv=(Button)findViewById(R.id.btnlv);
   btnLv.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, ListViewDemoActivity.class);
       startActivity(intent);
     }
   });
   //-------------------------------------------------------------------------------
   btnGv=(Button)findViewById(R.id.btnGv);
   btnGv.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, GvActivity.class);
       startActivity(intent);
     }
   });
   //-------------------------------------------------------------------------------
   btnMth=(Button)findViewById(R.id.btnMth);
   btnMth.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, SampleActivity.class);
       startActivity(intent);
     }
   });
   //-------------------------------------------------------------------------------
   btnMultispinner=(Button)findViewById(R.id.btnMultispinner);
   btnMultispinner.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, multispinnerActivity.class);
       startActivity(intent);
     }
   });
   //-------------------------------------------------------------------------------
   btnMenu=(Button)findViewById(R.id.btnMenu);
   btnMenu.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, CirclemenuActivity.class);
       startActivity(intent);
     }
   });

btnSlidemenu=(Button)findViewById(R.id.btnSlidemenu);
   btnSlidemenu.setOnClickListener(new View.OnClickListener()
   {
     @Override
     public void onClick(View v)
     {
       Intent intent=new Intent(MainActivity.this, slidemenuActivity.class);
       startActivity(intent);
     }
   });
 }

@Override
 protected void onStart()
 {
   super.onStart();
   NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
   manager.cancel(R.layout.activity_main);
 }
}

activity_main.xml内容:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context="siso.handlerdemo.MainActivity">

<Button
   android:id="@+id/btnStartService"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="Start Service"
   android:layout_alignParentTop="true"
   android:layout_alignParentStart="true" />

<TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="Hello World!"
   android:id="@+id/textView"
   android:layout_below="@+id/btnSR"
   android:layout_centerHorizontal="true" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="广播页面"
   android:id="@+id/btnRb"
   android:layout_below="@+id/btnStartService"
   android:layout_alignParentStart="true" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="文件保存页面"
   android:id="@+id/btnFile"
   android:layout_below="@+id/btnRb"
   android:layout_alignParentStart="true" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="使用SharedPreferences进行数据存储"
   android:id="@+id/btnSR"
   android:layout_below="@+id/btnFile"
   android:layout_alignParentStart="true" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="ListView使用"
   android:id="@+id/btnlv"
   android:layout_below="@+id/textView"
   android:layout_centerHorizontal="true" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="GridView使用"
   android:id="@+id/btnGv"
   android:layout_below="@+id/btnlv"
   android:layout_centerHorizontal="true" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="TabHost"
   android:id="@+id/btnMth"
   android:layout_below="@+id/btnGv"
   android:layout_centerHorizontal="true" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="Multispinner"
   android:id="@+id/btnMultispinner"
   android:layout_below="@+id/btnMth"
   android:layout_centerHorizontal="true" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="Menu使用"
   android:id="@+id/btnMenu"
   android:layout_below="@+id/btnMultispinner"
   android:layout_toStartOf="@+id/textView" />

<Button
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="滑动Menu"
   android:id="@+id/btnSlidemenu"
   android:layout_below="@+id/btnMultispinner"
   android:layout_alignStart="@+id/textView"
   android:layout_marginStart="37dp" />

</RelativeLayout>

CirclemenuActivity.java代码:


package siso.handlerdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import siso.view.CircleImageView;
import siso.view.CircleLayout;

public class CirclemenuActivity extends AppCompatActivity implements CircleLayout.OnItemSelectedListener, CircleLayout.OnItemClickListener {

TextView selectedTextView;

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

CircleLayout circleMenu = (CircleLayout)findViewById(R.id.main_circle_layout);
   circleMenu.setOnItemSelectedListener(this);
   circleMenu.setOnItemClickListener(this);

selectedTextView = (TextView)findViewById(R.id.main_selected_textView);
   selectedTextView.setText(((CircleImageView)circleMenu.getSelectedItem()).getName());
 }

@Override
 public void onItemSelected(View view, int position, long id, String name) {
   selectedTextView.setText(name);
 }

@Override
 public void onItemClick(View view, int position, long id, String name) {
   Toast.makeText(getApplicationContext(), getResources().getString(R.string.start_app) + " " + name, Toast.LENGTH_SHORT).show();
 }
}

CircleImageView.java代码:


package siso.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.ImageView;

import siso.handlerdemo.R;

public class CircleImageView extends ImageView {

private float angle = 0;
 private int position = 0;
 private String name;

public float getAngle() {
   return angle;
 }

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

public int getPosition() {
   return position;
 }

public void setPosition(int position) {
   this.position = position;
 }

public String getName(){
   return name;
 }

public void setName(String name){
   this.name = name;
 }

/**
  * @param context
  */
 public CircleImageView(Context context) {
   this(context, null);
 }

/**
  * @param context
  * @param attrs
  */
 public CircleImageView(Context context, AttributeSet attrs) {
   this(context, attrs, 0);
 }

/**
  * @param context
  * @param attrs
  * @param defStyle
  */
 public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
   super(context, attrs, defStyle);
   if (attrs != null) {
     TypedArray a = getContext().obtainStyledAttributes(attrs,
         R.styleable.CircleImageView);

name = a.getString(R.styleable.CircleImageView_name);
   }
 }

}

CircleLayout.java代码:


package siso.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

import siso.handlerdemo.R;

public class CircleLayout extends ViewGroup {

private OnItemClickListener mOnItemClickListener = null;
 private OnItemSelectedListener mOnItemSelectedListener = null;
 private OnCenterClickListener mOnCenterClickListener = null;

private Bitmap imageOriginal, imageScaled;
 private Matrix matrix;

private int mTappedViewsPostition = -1;
 private View mTappedView = null;
 private int selected = 0;

private int mMaxChildWidth = 0;
 private int mMaxChildHeight = 0;
 private int childWidth = 0;
 private int childHeight = 0;

private int circleWidth, circleHeight;
 private int radius = 0;

private GestureDetector mGestureDetector;

private boolean[] quadrantTouched;

private boolean allowRotating = true;
 private float angle = 90;
 private float firstChildPos = 90;
 private boolean rotateToCenter = true;
 private boolean isRotating = true;

/**
  * @param context
  */
 public CircleLayout(Context context) {
   this(context, null);
 }

/**
  * @param context
  * @param attrs
  */
 public CircleLayout(Context context, AttributeSet attrs) {
   this(context, attrs, 0);
 }

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

protected void init(AttributeSet attrs) {
   mGestureDetector = new GestureDetector(getContext(),
       new MyGestureListener());
   quadrantTouched = new boolean[] { false, false, false, false, false };

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

angle = a.getInt(R.styleable.Circle_firstChildPosition, 90);
     firstChildPos = angle;

rotateToCenter = a.getBoolean(R.styleable.Circle_rotateToCenter,
         true);    
     isRotating = a.getBoolean(R.styleable.Circle_isRotating, true);

if (!isRotating) {
       rotateToCenter = false;
     }

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

if (picId != -1) {
         imageOriginal = BitmapFactory.decodeResource(
             getResources(), picId);
       }
     }

a.recycle();

if (matrix == null) {
       matrix = new Matrix();
     } else {

matrix.reset();
     }

setWillNotDraw(false);
   }
 }

public View getSelectedItem() {
   return (selected >= 0) ? getChildAt(selected) : null;
 }

@Override
 protected void onDraw(Canvas canvas) {

circleHeight = getHeight();
   circleWidth = getWidth();

if (imageOriginal != null) {

if (imageScaled == null) {
       matrix = new Matrix();
       float sx = (((radius + childWidth / 4) * 2) / (float) imageOriginal
           .getWidth());
       float sy = (((radius + childWidth / 4) * 2) / (float) imageOriginal
           .getHeight());
       matrix.postScale(sx, sy);
       imageScaled = Bitmap.createBitmap(imageOriginal, 0, 0,
           imageOriginal.getWidth(), imageOriginal.getHeight(),
           matrix, false);
     }

if (imageScaled != null) {

int cx = (circleWidth - imageScaled.getWidth()) / 2;
       int cy = (circleHeight - imageScaled.getHeight()) / 2;

Canvas g = canvas;
       canvas.rotate(0, circleWidth / 2, circleHeight / 2);
       g.drawBitmap(imageScaled, cx, cy, null);

}
   }
 }

@Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   mMaxChildWidth = 0;
   mMaxChildHeight = 0;

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

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

child.measure(childWidthMeasureSpec, childHeightMeasureSpec);

mMaxChildWidth = Math.max(mMaxChildWidth, child.getMeasuredWidth());
     mMaxChildHeight = Math.max(mMaxChildHeight,
         child.getMeasuredHeight());
   }

childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxChildWidth,
       MeasureSpec.EXACTLY);
   childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxChildHeight,
       MeasureSpec.EXACTLY);

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

child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
   }

setMeasuredDimension(resolveSize(mMaxChildWidth, widthMeasureSpec),
       resolveSize(mMaxChildHeight, heightMeasureSpec));
 }

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

final int childCount = getChildCount();
   int left, top;
   radius = (layoutWidth <= layoutHeight) ? layoutWidth / 3
       : layoutHeight / 3;

childWidth = (int) (radius / 1.5);
   childHeight = (int) (radius / 1.5);

float angleDelay = 360 / getChildCount();

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

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

child.setAngle(angle);
     child.setPosition(i);

left = Math
         .round((float) (((layoutWidth / 2) - childWidth / 2) + radius
             * Math.cos(Math.toRadians(angle))));
     top = Math
         .round((float) (((layoutHeight / 2) - childHeight / 2) + radius
             * Math.sin(Math.toRadians(angle))));

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

private void rotateButtons(float degrees) {
   int left, top, childCount = getChildCount();
   float angleDelay = 360 / childCount;
   angle += degrees;

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

for (int i = 0; i < childCount; i++) {
     if (angle > 360) {
       angle -= 360;
     } else {
       if (angle < 0) {
         angle += 360;
       }
     }

final CircleImageView child = (CircleImageView) getChildAt(i);
     if (child.getVisibility() == GONE) {
       continue;
     }
     left = Math
         .round((float) (((circleWidth / 2) - childWidth / 2) + radius
             * Math.cos(Math.toRadians(angle))));
     top = Math
         .round((float) (((circleHeight / 2) - childHeight / 2) + radius
             * Math.sin(Math.toRadians(angle))));

child.setAngle(angle);

if (Math.abs(angle - firstChildPos) < (angleDelay / 2)
         && selected != child.getPosition()) {
       selected = child.getPosition();

if (mOnItemSelectedListener != null && rotateToCenter) {
         mOnItemSelectedListener.onItemSelected(child, selected,
             child.getId(), child.getName());
       }
     }

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

private double getAngle(double xTouch, double yTouch) {
   double x = xTouch - (circleWidth / 2d);
   double y = circleHeight - yTouch - (circleHeight / 2d);

switch (getQuadrant(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:

return 0;
   }
 }

private static int getQuadrant(double x, double y) {
   if (x >= 0) {
     return y >= 0 ? 1 : 4;
   } else {
     return y >= 0 ? 2 : 3;
   }
 }

private double startAngle;

@Override
 public boolean onTouchEvent(MotionEvent event) {
   if (isEnabled()) {
     if (isRotating) {
       switch (event.getAction()) {
       case MotionEvent.ACTION_DOWN:

for (int i = 0; i < quadrantTouched.length; i++) {
           quadrantTouched[i] = false;
         }

allowRotating = false;

startAngle = getAngle(event.getX(), event.getY());
         break;
       case MotionEvent.ACTION_MOVE:
         double currentAngle = getAngle(event.getX(), event.getY());
         rotateButtons((float) (startAngle - currentAngle));
         startAngle = currentAngle;
         break;
       case MotionEvent.ACTION_UP:
         allowRotating = true;
         rotateViewToCenter((CircleImageView) getChildAt(selected),
             false);
         break;
       }
     }

quadrantTouched[getQuadrant(event.getX() - (circleWidth / 2),
         circleHeight - event.getY() - (circleHeight / 2))] = true;
     mGestureDetector.onTouchEvent(event);
     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;
     }

int q1 = getQuadrant(e1.getX() - (circleWidth / 2), circleHeight
         - e1.getY() - (circleHeight / 2));
     int q2 = getQuadrant(e2.getX() - (circleWidth / 2), circleHeight
         - e2.getY() - (circleHeight / 2));

if ((q1 == 2 && q2 == 2 && Math.abs(velocityX) < Math
         .abs(velocityY))
         || (q1 == 3 && q2 == 3)
         || (q1 == 1 && q2 == 3)
         || (q1 == 4 && q2 == 4 && Math.abs(velocityX) > Math
             .abs(velocityY))
         || ((q1 == 2 && q2 == 3) || (q1 == 3 && q2 == 2))
         || ((q1 == 3 && q2 == 4) || (q1 == 4 && q2 == 3))
         || (q1 == 2 && q2 == 4 && quadrantTouched[3])
         || (q1 == 4 && q2 == 2 && quadrantTouched[3])) {

CircleLayout.this.post(new FlingRunnable(-1
           * (velocityX + velocityY)));
     } else {

CircleLayout.this
           .post(new FlingRunnable(velocityX + velocityY));
     }

return true;

}

@Override
   public boolean onSingleTapUp(MotionEvent e) {
     mTappedViewsPostition = pointToPosition(e.getX(), e.getY());
     if (mTappedViewsPostition >= 0) {
       mTappedView = getChildAt(mTappedViewsPostition);
       mTappedView.setPressed(true);
     } else {
       float centerX = circleWidth / 2;
       float centerY = circleHeight / 2;

if (e.getX() < centerX + (childWidth / 2)
           && e.getX() > centerX - childWidth / 2
           && e.getY() < centerY + (childHeight / 2)
           && e.getY() > centerY - (childHeight / 2)) {
         if (mOnCenterClickListener != null) {
           mOnCenterClickListener.onCenterClick();
           return true;
         }
       }
     }

if (mTappedView != null) {
       CircleImageView view = (CircleImageView) (mTappedView);
       if (selected != mTappedViewsPostition) {
         rotateViewToCenter(view, false);
         if (!rotateToCenter) {
           if (mOnItemSelectedListener != null) {
             mOnItemSelectedListener.onItemSelected(mTappedView,
                 mTappedViewsPostition, mTappedView.getId(), view.getName());
           }

if (mOnItemClickListener != null) {
             mOnItemClickListener.onItemClick(mTappedView,
                 mTappedViewsPostition, mTappedView.getId(), view.getName());
           }
         }
       } else {
         rotateViewToCenter(view, false);

if (mOnItemClickListener != null) {
           mOnItemClickListener.onItemClick(mTappedView,
               mTappedViewsPostition, mTappedView.getId(), view.getName());
         }
       }
       return true;
     }
     return super.onSingleTapUp(e);
   }
 }

private void rotateViewToCenter(CircleImageView view, boolean fromRunnable) {
   if (rotateToCenter) {
     float velocityTemp = 1;
     float destAngle = (float) (firstChildPos - view.getAngle());
     float startAngle = 0;
     int reverser = 1;

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

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

while (startAngle < destAngle) {
       startAngle += velocityTemp / 75;
       velocityTemp *= 1.0666F;
     }

CircleLayout.this.post(new FlingRunnable(reverser * velocityTemp,
         !fromRunnable));
   }
 }

private class FlingRunnable implements Runnable {

private float velocity;
   float angleDelay;
   boolean isFirstForwarding = true;

public FlingRunnable(float velocity) {
     this(velocity*0.4f, true);
   }

public FlingRunnable(float velocity, boolean isFirst) {
     this.velocity = velocity;
     this.angleDelay = 360 / getChildCount();
     this.isFirstForwarding = isFirst;
   }

public void run() {
     if (Math.abs(velocity) > 5 && allowRotating) {
       if (rotateToCenter) {
         if (!(Math.abs(velocity) < 200 && (Math.abs(angle
             - firstChildPos)
             % angleDelay < 2))) {
           rotateButtons(velocity / 75);
           velocity /= 1.0666F;

CircleLayout.this.post(this);
         }
       } else {
         rotateButtons(velocity / 75);
         velocity /= 1.0666F;

CircleLayout.this.post(this);
       }
     } else {
       if (isFirstForwarding) {
         isFirstForwarding = false;
         CircleLayout.this.rotateViewToCenter(
             (CircleImageView) getChildAt(selected), true);
       }
     }
   }
 }

private int pointToPosition(float x, float y) {

for (int i = 0; i < getChildCount(); i++) {

View item = (View) getChildAt(i);
     if (item.getLeft() < x && item.getRight() > x & item.getTop() < y
         && item.getBottom() > y) {
       return i;
     }

}
   return -1;
 }

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

public interface OnItemClickListener {
   void onItemClick(View view, int position, long id, String name);
 }

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

public interface OnItemSelectedListener {
   void onItemSelected(View view, int position, long id, String name);
 }

public interface OnCenterClickListener {
   void onCenterClick();
 }

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

activity_circlemenu.xml内容:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 xmlns:circle="http://schemas.android.com/apk/res-auto"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context="siso.handlerdemo.CirclemenuActivity">

<siso.view.CircleLayout
   android:id="@+id/main_circle_layout"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:layout_above="@+id/main_selected_textView"
   android:layout_gravity="center_horizontal"
   circle:firstChildPosition="South"
   circle:rotateToCenter="false"
   circle:isRotating="true" >

<siso.view.CircleImageView
     android:id="@+id/main_facebook_image"
     android:layout_width="35dp"
     android:layout_height="35dp"
     android:src="@drawable/icon_facebook"
     circle:name="@string/facebook" />

<siso.view.CircleImageView
     android:id="@+id/main_myspace_image"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@drawable/icon_myspace"
     circle:name="@string/myspace" />

<siso.view.CircleImageView
     android:id="@+id/main_google_image"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@drawable/icon_google"
     circle:name="@string/google" />

<siso.view.CircleImageView
     android:id="@+id/main_linkedin_image"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@drawable/icon_linkedin"
     circle:name="@string/linkedin" />

<siso.view.CircleImageView
     android:id="@+id/main_twitter_image"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@drawable/icon_twitter"
     circle:name="@string/twitter" />

<siso.view.CircleImageView
     android:id="@+id/main_wordpress_image"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@drawable/icon_wordpress"
     circle:name="@string/wordpress" />
 </siso.view.CircleLayout>

<TextView
   android:id="@+id/main_selected_textView"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   android:layout_centerHorizontal="true"
   android:layout_marginBottom="50dp"
   android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>

strings.xml内容:


<string name="facebook">Facebook</string>
 <string name="twitter">Twitter</string>
 <string name="google">Google</string>
 <string name="linkedin">LinkedIn</string>
 <string name="wordpress">Wordpress</string>
 <string name="myspace">Myspace</string>
 <string name="start_app">Starting application:</string>

attrs.xml内容:


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

<declare-styleable name="Circle">
   <attr name="circleBackground" 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>
   <attr name="rotateToCenter" format="boolean" />
   <attr name="isRotating" format="boolean" />
 </declare-styleable>
 <declare-styleable name="CircleImageView">
   <attr name="name" format="string" />
 </declare-styleable>
</resources>

运行结果如图:

Android学习教程之圆形Menu菜单制作方法(1)

Android学习教程之圆形Menu菜单制作方法(1)

Android学习教程之圆形Menu菜单制作方法(1)

标签:Android,Menu,菜单
0
投稿

猜你喜欢

  • Java 方法的定义与调用详解

    2023-11-04 13:52:58
  • Android Studio 中aidl的自定义类的使用详解

    2022-04-18 17:35:43
  • android 添加按(power键)电源键结束通话(挂断电话)

    2023-08-14 20:38:24
  • SpringBoot如何通过Feign调用传递Header中参数

    2023-11-24 21:39:29
  • Java聊天室之解决连接超时问题

    2021-06-07 16:30:54
  • 深入了解JAVA HASHMAP的死循环

    2023-11-28 00:32:12
  • Android开发性能优化总结

    2021-11-05 14:03:59
  • Java解析json报文实例解析

    2023-07-18 21:33:58
  • java 实现随机数组输出及求和实例详解

    2021-10-27 13:12:50
  • Android实现MVVM架构数据刷新详解流程

    2023-07-05 13:33:41
  • java新手入门——String类详解

    2022-02-23 08:17:26
  • Android短信验证服务分享

    2023-04-04 12:35:59
  • SpringBoot登录用户权限拦截器

    2022-07-15 04:18:04
  • C#强制转换和尝试转换的方法

    2021-10-10 10:48:23
  • Android实现时钟特效

    2022-09-08 01:43:22
  • Unity实现虚拟键盘

    2022-05-24 11:25:38
  • Java数据结构之优先级队列(堆)图文详解

    2021-06-25 13:47:58
  • 深入了解c# 匿名类型

    2022-04-08 22:38:21
  • 使用Java方法配置Spring代码解析

    2023-07-15 09:20:59
  • java实现简单TCP聊天程序

    2021-09-29 20:18:15
  • asp之家 软件编程 m.aspxhome.com