Android Circle Menu


Android Circle Menu Activity

Hi, I am create the circle menu activity below,




1.First i am using MainActivity.java
package com.example.slide;
 import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
         CircleView cView;
         @Override
         public void onCreate(Bundle savedInstanceState) {
                   super.onCreate(savedInstanceState);
                   int numberOfElements = 5;
                   View[] elems = new View[numberOfElements];
                   for (int i = 0; i < numberOfElements; i++) {
                    TextView newButton = new TextView(this);
                            newButton.setText("Button   " + i);
                            newButton.setLayoutParams(new RelativeLayout.LayoutParams(
                                               RelativeLayout.LayoutParams.WRAP_CONTENT,
                                               RelativeLayout.LayoutParams.WRAP_CONTENT));
                            newButton.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_launcher, 0, 0);
                            elems[i] = newButton;
                   }
                   cView = new CircleView(this, 115, elems);
                   setContentView(cView);
         }
}

2.Second i am adding another Class CircleView.java

package com.example.slide;
import android.content.Context;
import android.view.View;
import android.widget.RelativeLayout;
public class CircleView extends RelativeLayout {
         static final int centerId = 111;
         private final int radius;
         private RelativeLayout.LayoutParams createNewRelativeLayoutParams() {
                   RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                                      RelativeLayout.LayoutParams.WRAP_CONTENT,
                                      RelativeLayout.LayoutParams.WRAP_CONTENT);
                   lp.addRule(RelativeLayout.ABOVE, centerId);
                   lp.addRule(RIGHT_OF, centerId);
                   return lp;
         }
         private View prepareElementForCircle(View elem, int distX, int distY) {
                   RelativeLayout.LayoutParams lp = createNewRelativeLayoutParams();
                   elem.measure(0, 0);
                   int deltaX = elem.getMeasuredWidth() / 2;
                   int deltaY = elem.getMeasuredHeight() / 2;
                   lp.setMargins(distX - deltaX, 0, 0, radius - distY - deltaY);
                   elem.setLayoutParams(lp);
                   return elem;
         }
         public CircleView(Context context, int radius, View[] elements) {
                   super(context);
                   this.radius = radius;
                   RelativeLayout.LayoutParams lpView = new RelativeLayout.LayoutParams(
                                      RelativeLayout.LayoutParams.MATCH_PARENT,
                                      RelativeLayout.LayoutParams.MATCH_PARENT);
                   this.setLayoutParams(lpView);
                   View center = new View(context);
                   center.setBackgroundColor(0xFFF77AC9);
                   center.setId(centerId);
                   RelativeLayout.LayoutParams lpcenter = new RelativeLayout.LayoutParams(  0, 0);
                   lpcenter.addRule(CENTER_HORIZONTAL);
                   lpcenter.addRule(CENTER_VERTICAL);
                   center.setLayoutParams(lpcenter);
                   this.addView(center);
                   this.addView(prepareElementForCircle(elements[0], 0, 0));
                   if (elements.length % 2 == 0) {
                            this.addView(prepareElementForCircle(elements[elements.length / 2], 0, 2 * radius));
                   }
                   if (elements.length > 2) {
                            for (int i = 1; i <= (elements.length - 1) / 2; i++) {
                                      int y = i * 4 * radius / elements.length;
                                      int x = (int) Math.sqrt(Math.pow(radius, 2) - Math.pow((radius - y), 2));
                                      this.addView(prepareElementForCircle(elements[i], x, y));
                                      this.addView(prepareElementForCircle(elements[elements.length  - i], -x, y));
                            }
                   }
         }
}


Post a Comment