If you do a popup control, we can add the view:
Write class Satellitemenu extends Framelayout
private void init (context context, AttributeSet attrs, int defstyle) {Inflate (context, r.layout.sat_main, this); Imgmain = (ImageView) Findviewbyid (R.id.sat_main); if (attrs! = null) {TypedArray TypedArray = Context.obtainstyledattribu TES (Attrs, R.styleable.satellitemenu, Defstyle, 0); satellitedistance = Typedarray.getdimensionpixelsize ( R.styleable.satellitemenu_satellitedistance, default_satellite_distance); totalspacingdegree = TypedArray.getFloat (R.styleable.satellitemenu_totalspacingdegree, default_total_spacing_degrees); Closeitemsonclick = Typedarray.getboolean (R.styleable.satellitemenu_closeonclick, default_close_on_click); expandDuration = Typedarray.getint (R.styleable.satellitemenu_expandduration, default_expand_duration);//float satelliteDistance = Typedvalue.applydimension (Typedvalue.complex_unit_dip, Getresources (), Getdisplaymetrics ()); Typedarray.recycle ();} Mainrotateleft = satelliteanimationcreator.createmainbuttonanimation (context); mainrotateright = SatelliteAniMationcreator.createmainbuttoninverseanimation (context); Animation.animationlistener Plusanimationlistener = new Animation.animationlistener () {@Overridepublic void Onanimationstart (Animation Animation) {} @Overridepublic void Onanimationrepeat (Animation Animation) {}@ overridepublic void Onanimationend (Animation Animation) {Plusanimationactive.set (false);}}; Mainrotateleft.setanimationlistener (Plusanimationlistener); Mainrotateright.setanimationlistener ( Plusanimationlistener); Imgmain.setonclicklistener (new View.onclicklistener () {@Overridepublic void OnClick (View v) { SatelliteMenu.this.onClick ();}}); Internalitemclicklistener = new Internalsatelliteonclicklistener (this);}
<?xml version= "1.0" encoding= "Utf-8"? ><merge xmlns:android= "Http://schemas.android.com/apk/res/android" > <imageview android:id= "@+id/sat_main" android:layout_width= "Wrap_content" android: layout_height= "Wrap_content" android:src= "@drawable/sat_main" android:layout_gravity= "Bottom|left" /> </merge><resources><declare-styleable name= "Satellitemenu" ><attr name= " Expandduration "format=" integer "/><attr name=" Closeonclick "format=" boolean "/><attr name=" Totalspacingdegree "format=" float "/><attr name=" satellitedistance "format=" Dimension "/><attr name=" Mainimage "format=" Reference "/></declare-styleable></resources>
Then write the logic to add the item:
public void Additems (list<satellitemenuitem> items) {menuitems.addall (items); This.removeview (Imgmain); TextView Tmpview = new TextView (GetContext ()); Tmpview.setlayoutparams (new Framelayout.layoutparams (0, 0)); float[] degrees = Getdegrees (Menuitems.size ()); int index = 0;for (Satellitemenuitem menuitem:menuitems) {int finalx = Satellitea Nimationcreator.gettranslatex (Degrees[index], satellitedistance); int finaly = Satelliteanimationcreator.gettranslatey (Degrees[index], satellitedistance); ImageView Itemview = (ImageView) Layoutinflater.from (GetContext ()). Inflate (R.LAYOUT.SAT_ITEM_CR, this, false); ImageView Cloneview = (ImageView) Layoutinflater.from (GetContext ()). Inflate (R.LAYOUT.SAT_ITEM_CR, this, false); Itemview.settag (Menuitem.getid ()); Cloneview.setvisibility (View.gone); itemview.setvisibility (View.gone); Cloneview.setonclicklistener ( Internalitemclicklistener); Cloneview.settag (Integer.valueof (Menuitem.getid ())); Framelayout.layoutparams layoutparams = Getlayoutparams (Cloneview); LayoUtparams.bottommargin = Math.Abs (finaly); layoutparams.leftmargin = Math.Abs (FINALX); Cloneview.setlayoutparams ( Layoutparams) <strong>//here is where the Cloneview is placed at the end of the Itemview animation </strong>if (Menuitem.getimgresourceid () > 0 ) {Itemview.setimageresource (Menuitem.getimgresourceid ()); Cloneview.setimageresource (MenuItem.getImgResourceId ( ));} else if (menuitem.getimgdrawable () = null) {itemview.setimagedrawable (menuitem.getimgdrawable ()); Cloneview.setimagedrawable (Menuitem.getimgdrawable ());} Animation itemout = satelliteanimationcreator.createitemoutanimation (GetContext (), Index,expandduration, FinalX, finaly); Animation itemin = satelliteanimationcreator.createiteminanimation (GetContext (), index, expandduration, FinalX, finaly); Animation ItemClick = satelliteanimationcreator.createitemclickanimation (GetContext ()); Menuitem.setview (ItemView) ; Menuitem.setcloneview (Cloneview); menuitem.setinanimation (itemin); menuitem.setoutanimation (ItemOut); Menuitem.setclickanimation (ItemClick); Menuitem.setfinaLX (FINALX); Menuitem.setfinaly (finaly); Itemin.setanimationlistener (New Satelliteanimationlistener (ItemView, True, Viewtoitemmap)); Itemout.setanimationlistener (New Satelliteanimationlistener (Itemview, False, ViewToItemMap)); Itemclick.setanimationlistener (New Satelliteitemclickanimationlistener (This, Menuitem.getid ())); This.addView ( Itemview); This.addview (Cloneview); Viewtoitemmap.put (Itemview, MenuItem); Viewtoitemmap.put (Cloneview, MenuItem); index++;} This.addview (Imgmain);}
Listener:
private static class Satelliteanimationlistener implements Animation.animationlistener {private Weakreference<view > Viewref;private boolean isinanimation;private map<view, satellitemenuitem> viewtoitemmap;public Satelliteanimationlistener (View view, Boolean isIn, Map<view, satellitemenuitem> viewtoitemmap) {this.viewref = New Weakreference<view> (View); this.isinanimation = Isin;this.viewtoitemmap = Viewtoitemmap;} @Overridepublic void Onanimationstart (Animation Animation) {if (viewref! = null) {View view = Viewref.get (); if (view! = Nu ll) {Satellitemenuitem MenuItem = viewtoitemmap.get (view); if (isinanimation) {Menuitem.getview (). Setvisibility ( view.visible); Menuitem.getcloneview (). setvisibility (View.gone);} else {Menuitem.getcloneview (). setvisibility (View.gone); Menuitem.getview (). setvisibility (view.visible);}}} @Overridepublic void Onanimationrepeat (Animation Animation) {} @Overridepublic void Onanimationend (Animation Animation ) {if (viewref! = null) {View view = VIEwref.get (); if (view! = null) {Satellitemenuitem MenuItem = viewtoitemmap.get (view); if (isinanimation) { Menuitem.getview (). setvisibility (View.gone); Menuitem.getcloneview (). setvisibility (View.gone);} else {Menuitem.getcloneview (). setvisibility (view.visible); Menuitem.getview (). setvisibility (View.GONE);}}}}
You must override Onmeature:
private void Recalculatemeasurediff () {int itemwidth = 0;if (menuitems.size () > 0) {itemwidth = Menuitems.get (0). Getvie W (). GetWidth ();} Measurediff = float.valueof (satellitedistance * 0.2f). Intvalue () + itemwidth;} @Overrideprotected void onmeasure (int widthmeasurespec, int heightmeasurespec) {super.onmeasure (Widthmeasurespec, HEIGHTMEASURESPEC); Recalculatemeasurediff (); int totalheight = Imgmain.getheight () + satellitedistance + MeasureDiff; int totalWidth = imgmain.getwidth () + satellitedistance + Measurediff; System.out.println ("====totalwidth=" +totalwidth+ "height=" +totalheight+ "measurediff=" +measurediff+ " Imgmain.getwidth () = "+imgmain.getwidth ()"); Setmeasureddimension (TotalWidth, totalheight);}
Save and restore the status of the activity:
@Overrideprotected parcelable onsaveinstancestate () {parcelable superstate = super.onsaveinstancestate (); savedstate ss = new savedstate (superstate); ss.rotated = Rotated;ss.totalspacingdegree = Totalspacingdegree; Ss.satellitedistance = Satellitedistance;ss.measurediff = Measurediff;ss.expandduration = expandDuration; Ss.closeitemsonclick = Closeitemsonclick;return SS;} @Overrideprotected void Onrestoreinstancestate (parcelable state) {savedstate SS = (savedstate) state;rotated = Ss.rotated;totalspacingdegree = Ss.totalspacingdegree;satellitedistance = Ss.satellitedistance;measurediff = Ss.measurediff;expandduration = Ss.expandduration;closeitemsonclick = Ss.closeitemsonclick; Super.onrestoreinstancestate (Ss.getsuperstate ());} Static Class Savedstate extends Basesavedstate {boolean rotated;private float totalspacingdegree;private int satellitedistance;private int Measurediff;private int expandduration;private Boolean closeitemsonclick; Savedstate (parcelable superstate) {super (superstate);} PublIC savedstate (Parcel in) {super (in); rotated = Boolean.valueof (in.readstring ()); totalspacingdegree = In.readfloat (); Satellitedistance = In.readint (); Measurediff = In.readint (); expandduration = In.readint (); Closeitemsonclick = Boolean.valueof (In.readstring ());} @Overridepublic int describecontents () {return 0;} @Overridepublic void Writetoparcel (Parcel out, int flags) {out.writestring (boolean.tostring (rotated)); out.writefloat (Totalspacingdegree); Out.writeint (satellitedistance); Out.writeint (Measurediff); Out.writeint (expandDuration); o Ut.writestring (boolean.tostring (Closeitemsonclick));} public static final parcelable.creator<savedstate> Creator = new parcelable.creator<savedstate> () {public Savedstate Createfromparcel (Parcel in) {return new savedstate (in);} Public savedstate[] NewArray (int size) {return new savedstate[size];};}
:
Code: http://download.csdn.net/detail/baidu_nod/7731115