android一個快顯功能表的動畫(二)

來源:互聯網
上載者:User

android一個快顯功能表的動畫(二)

如果做一個彈出的控制項,我們可以進行添加view:

寫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.obtainStyledAttributes(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, 170, 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);}

                

然後寫添加Item的邏輯:

public void addItems(List 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 = SatelliteAnimationCreator.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);//這裡是將cloneView置於itemview動畫結束的位置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);}

監聽器:

private static class SatelliteAnimationListener implements Animation.AnimationListener {private WeakReference viewRef;private boolean isInAnimation;private Map viewToItemMap;public SatelliteAnimationListener(View view, boolean isIn, Map viewToItemMap) {this.viewRef = new WeakReference(view);this.isInAnimation = isIn;this.viewToItemMap = viewToItemMap;}@Overridepublic void onAnimationStart(Animation animation) {if (viewRef != null) {View view = viewRef.get();if (view != null) {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);}}}}}

必須重寫onMeature:

private void recalculateMeasureDiff() {int itemWidth = 0;if (menuItems.size() > 0) {itemWidth = menuItems.get(0).getView().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和恢複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);out.writeString(Boolean.toString(closeItemsOnClick));}public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {public SavedState createFromParcel(Parcel in) {return new SavedState(in);}public SavedState[] newArray(int size) {return new SavedState[size];}};}


:




代碼:http://download.csdn.net/detail/baidu_nod/7731115

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.