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
.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();
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