

Further, all bindings to the application were removed: fields, methods, listeners, etc. (and the code is really very connected with the application components, i.e. it is trivial to take and declare an object not work). For ease of use, the side menu has added the ability to install separate Listeners on different menu items, adding Item 's from the List . In the initial implementation, the level parameter in the constructor did not work at all. He is responsible for the number of the ring in the menu, where the 1st ring with the minimum radius, and with increasing level the radius increases. After studying the code, it turned out that Path , which draws the background for the icon, was reassigned for each new ring in the drawing method, which made it impossible to use the multi-level menu. This deficiency has been eliminated.Item .
This class allows you to implement a side menu.populateMenu() . I also advise you to add setListeners() for conveniently installing Listener clicks. The PieItem element PieItem created using makeItem() . As parameters, we specify the resource icon and level (ring number). Then we create an object of our new class, bind it to the frame via attachToContainer() and install the Listeners by calling the setListeners() method. private class TestMenu extends PieControl { List<PieItem> plus_sub; List<PieItem> minus_sub; public TestMenu(Activity activity) { super(activity); } protected void populateMenu() { PieItem plus = makeItem(android.R.drawable.ic_input_add,1); { plus_sub = new ArrayList<PieItem>(2); plus_sub.add(makeItem(android.R.drawable.ic_input_add,2)); plus_sub.add(makeItem(android.R.drawable.ic_input_add, 2)); plus.addItems(plus_sub); } PieItem minus = makeItem(android.R.drawable.ic_menu_preferences,1); { minus_sub = new ArrayList<PieItem>(2); minus_sub.add(makeItem(android.R.drawable.ic_menu_preferences,1)); minus_sub.add(makeItem(android.R.drawable.ic_menu_preferences, 1)); minus.addItems(minus_sub); } PieItem close = makeItem(android.R.drawable.ic_menu_close_clear_cancel,1); mPie.addItem(plus); mPie.addItem(minus); mPie.addItem(close); PieItem level2_0 = makeItem(android.R.drawable.ic_menu_report_image, 2); mPie.addItem(level2_0); PieItem level2_1 = makeItem(android.R.drawable.ic_media_next, 2); mPie.addItem(level2_1); } public void setListeners() { this.setClickListener(plus_sub.get(0),new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getApplicationContext(),"Clicked plus 1", Toast.LENGTH_SHORT).show(); } }); this.setClickListener(plus_sub.get(1), new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getApplicationContext(),"Clicked plus 2", Toast.LENGTH_SHORT).show(); } }); this.setClickListener(minus_sub.get(0), new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getApplicationContext(),"Clicked minus 1", Toast.LENGTH_SHORT).show(); } }); this.setClickListener(minus_sub.get(1), new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getApplicationContext(),"Clicked minus 2", Toast.LENGTH_SHORT).show(); } }); this.setClickListener(close, new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); } } TestMenu testMenu = new TestMenu(this); testMenu.attachToContainer(some_container); testMenu.setListeners();
This class allows you to implement a circular menu from the Camera application. To use it, in my opinion, is much easier than PieControl. Conceptually, this menu is different from the sidebar: you can attach it not to any ViewGroup heirs, but only to a special RenderOverlay (which is actually a regular FrameLayout with a small set of additional methods, but this is inner workings). To RenderOverlay you can bind objects of the Renderer type, the heir of which is PieRenderer . We need it to draw the menu. We also need the PieController class to add items to the menu. So let's get started:PieRenderer object, a PieController object, menu items using the makeItem method in PieController . Add menu items to PieRenderer via addItem. Then we create the RenderOverlay object (or find it via findViewById , if you like to define everything in xml). Add PieRendere to RenderOverlay via addRenderer . Now the final touch: in onTouchEvent send an event to the PieRenderer handler PieRenderer public class MainActivity extends Activity { private static float FLOAT_PI_DIVIDED_BY_TWO = (float) Math.PI / 2; private final static float sweep = FLOAT_PI_DIVIDED_BY_TWO / 2; private PieRenderer pieRenderer; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); pieRenderer = new PieRenderer(getApplicationContext()); PieController pieController = new PieController(this, pieRenderer); RenderOverlay renderOverlay = (RenderOverlay) findViewById(R.id.render_overlay); PieItem item0 = pieController.makeItem(android.R.drawable.arrow_up_float); item0.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO, sweep); item0.setOnClickListener(new PieItem.OnClickListener() { @Override public void onClick(PieItem item) { Toast.makeText(getApplicationContext(), "some cmd", Toast.LENGTH_SHORT).show(); } }); PieItem item1 = pieController.makeItem(android.R.drawable.arrow_up_float); item1.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep); item1.setOnClickListener(new PieItem.OnClickListener() { @Override public void onClick(PieItem item) { Toast.makeText(getApplicationContext(), "some cmd 2", Toast.LENGTH_SHORT).show(); } }); PieItem item7 = pieController.makeItem(android.R.drawable.arrow_up_float); item7.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep); item7.setOnClickListener(new PieItem.OnClickListener() { @Override public void onClick(PieItem item) { Toast.makeText(getApplicationContext(), "some cmd 7", Toast.LENGTH_SHORT).show(); } }); pieRenderer.addItem(item0); pieRenderer.addItem(item1); pieRenderer.addItem(item7); PieItem item0_0 = pieController.makeItem(android.R.drawable.ic_menu_add); item0_0.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO, sweep); item0_0.setOnClickListener(new PieItem.OnClickListener() { @Override public void onClick(PieItem item) { Toast.makeText(getApplicationContext(), "some cmd", Toast.LENGTH_SHORT).show(); } }); PieItem item0_6 = pieController.makeItem(android.R.drawable.ic_menu_add); item0_6.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep); item0_6.setOnClickListener(new PieItem.OnClickListener() { @Override public void onClick(PieItem item) { Toast.makeText(getApplicationContext(), "some cmd 2", Toast.LENGTH_SHORT).show(); } }); PieItem item0_7 = pieController.makeItem(android.R.drawable.ic_menu_add); item0_7.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep); item0_7.setOnClickListener(new PieItem.OnClickListener() { @Override public void onClick(PieItem item) { Toast.makeText(getApplicationContext(), "some cmd 7", Toast.LENGTH_SHORT).show(); } }); item0.addItem(item0_0); item0.addItem(item0_6); item0.addItem(item0_7); renderOverlay.addRenderer(pieRenderer); } @Override public boolean onTouchEvent(MotionEvent event) { pieRenderer.onTouchEvent(event); return super.onTouchEvent(event); } } Source: https://habr.com/ru/post/164035/
All Articles