日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android實現衛星菜單效果

瀏覽:42日期:2022-09-23 09:18:00

前言

最近需求中,需要實現 衛星菜單的需求,最終通過自定義View和動畫屬性來實現,具體功能如下:

Android實現衛星菜單效果

1.自定義View

import android.content.Context;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.AnimationUtils;import android.view.animation.RotateAnimation;import android.view.animation.TranslateAnimation;import com.xinrui.headsettest.R;/** * 衛星菜單 */public class SatelliteView extends ViewGroup { private View mBtnView; private MenuStatus mBStatus = MenuStatus.STATUS_CLOSE; private onSubItemClickListener onListener; public enum MenuStatus { STATUS_OPEN, STATUS_CLOSE } //子菜單點擊接口 public interface onSubItemClickListener { void onItemClick(View view, int position); } public void setOnSubItemClickListener(onSubItemClickListener mListener) { this.onListener = mListener; } public SatelliteView(Context context) { super(context);// this(context, null); } public SatelliteView(Context context, AttributeSet attrs) { super(context, attrs);// this(context, attrs, 0); } public SatelliteView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int count = getChildCount(); for (int i = 0; i < count; i++) { measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } //添加布局,就是所要顯示的控件View @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (changed) { //主菜單按鈕 onMainButton(); //子菜單按鈕 onSubItemButton(); } } //獲取主菜單按鈕 private void onMainButton() { mBtnView = getChildAt(0); mBtnView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {//主菜單動畫旋轉動畫Animation rotateAnim = AnimationUtils.loadAnimation(getContext(), R.anim.satellite_anim);mBtnView.startAnimation(rotateAnim);//子菜單動畫subItemAnim(); } }); int l, t, r = 0, b = 0; int mWidth = mBtnView.getMeasuredWidth(); int mHeight = mBtnView.getMeasuredHeight(); l = getMeasuredWidth() - mWidth; t = getMeasuredHeight() - mHeight; mBtnView.layout(l, t, getMeasuredWidth(), getMeasuredHeight()); } //獲取子菜單按鈕 private void onSubItemButton() { int count = getChildCount(); for (int i = 0; i < count - 1; i++) { View childView = getChildAt(i + 1); //開始時不呈現子菜單 childView.setVisibility(View.GONE); int radius = 350; int cl, ct, cr, cb; cr = (int) (radius * Math.sin(Math.PI / 2 / (count - 2) * i)); cb = (int) (radius * Math.cos(Math.PI / 2 / (count - 2) * i)); int cWidth = childView.getMeasuredWidth(); int cHeight = childView.getMeasuredHeight(); cl = getMeasuredWidth() - cWidth - cr; ct = getMeasuredHeight() - cHeight - cb; //layout(l,t,r,b);前兩參數決定位置,后兩參數決定大小 //參數(1,t)為View控件的左上角坐標 // (r-l,b-t)為View控件大小,r-l為控件寬度,b-t為控件高度 childView.layout(cl, ct, getMeasuredWidth() - cr, getMeasuredHeight() - cb); } } //子菜單散開回籠動畫 public void subItemAnim() { int count = getChildCount(); for (int i = 0; i < count - 1; i++) { final View childView = getChildAt(i + 1); //點擊主菜單后,子菜單就立刻呈現,否則后面的動畫無法完成 childView.setVisibility(VISIBLE); int radius = 350; int l, t, r, d; r = (int) (radius * Math.sin(Math.PI / 2 / (count - 2) * i)); d = (int) (radius * Math.cos(Math.PI / 2 / (count - 2) * i));// int cWidth = cView.getMeasuredWidth();// int cHeight = cView.getMeasuredHeight();//// l = getMeasuredWidth() - cWidth - r;// t = getMeasuredHeight() - cHeight - d; AnimationSet mAnimationSet = new AnimationSet(true); Animation mTranAnimation = null; if (mBStatus == MenuStatus.STATUS_CLOSE) {//散開動畫mTranAnimation = new TranslateAnimation(r, 0, d, 0);childView.setClickable(true);childView.setFocusable(true); } else {//回籠動畫mTranAnimation = new TranslateAnimation(0, r, 0, d);childView.setClickable(false);childView.setFocusable(false); } mTranAnimation.setDuration(300);// tranAnim.setFillAfter(true); //讓最后一幀的動畫不消失 mTranAnimation.setStartOffset(100 * i / count); mTranAnimation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) { if (mBStatus == MenuStatus.STATUS_CLOSE) { childView.setVisibility(GONE); }}@Overridepublic void onAnimationRepeat(Animation animation) {} }); Animation rotateAnim = new RotateAnimation( 0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotateAnim.setDuration(300);// rotateAnim.setFillAfter(false); mAnimationSet.addAnimation(rotateAnim); mAnimationSet.addAnimation(mTranAnimation); childView.startAnimation(mAnimationSet); //散開后子菜單的點擊監聽事件 final int pos = i + 1; childView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) { if (onListener != null) { onListener.onItemClick(childView, pos); } //散開后點擊子菜單動畫 subItemClickAnim(pos - 1); changStatus();} }); } changStatus(); } //監聽子菜單狀態改變 private void changStatus() { mBStatus = (mBStatus == MenuStatus.STATUS_CLOSE ? MenuStatus.STATUS_OPEN : MenuStatus.STATUS_CLOSE); } //散開后點擊子菜單動畫 private void subItemClickAnim(int pos) { int count = getChildCount(); for (int i = 0;i<count-1;i++) { View mChildView = getChildAt(i+1); if(i == pos) {//變大,變透明mChildView.startAnimation(toBig()); } else {//變小,變透明mChildView.startAnimation(toSmall()); } mChildView.setClickable(false); mChildView.setFocusable(false); } } //變大,變透明 private Animation toBig(){ Animation big = AnimationUtils.loadAnimation(getContext(), R.anim.bigalpha); return big; } //變小,變透明 private Animation toSmall(){ Animation small = AnimationUtils.loadAnimation(getContext(),R.anim.smallalpha); return small; } //給ListView調用 public boolean isOpen() { return mBStatus == MenuStatus.STATUS_OPEN; }}

2.SatelliteActivity

import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AbsListView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import com.xinrui.headsettest.arc.SatelliteView;import java.util.ArrayList;import java.util.List;public class SatelliteActivity extends Activity { private SatelliteView mSatelliteView; private ListView mListView; private List<String> mData; private ArrayAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.satellite_layout); mSatelliteView = (SatelliteView) findViewById(R.id.view_arc); mSatelliteView.setOnSubItemClickListener(new SatelliteView.onSubItemClickListener() { @Override public void onItemClick(View view, int position) {Toast.makeText(SatelliteActivity.this, 'position' + position, Toast.LENGTH_SHORT).show(); } }); initListView(); } private void initListView() { mListView = (ListView) findViewById(R.id.listview); mData = new ArrayList<String>(); for (int i = ’A’; i <= ’z’; i++) { mData.add((char) i + ''); } mAdapter = new ArrayAdapter<String>(SatelliteActivity.this, android.R.layout.simple_list_item_1, mData); mListView.setAdapter(mAdapter); mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if (mSatelliteView.isOpen()) { mSatelliteView.subItemAnim();} } }); }}

3.satellite_layout.xml

<?xml version='1.0' encoding='utf-8'?><RelativeLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='match_parent'> <ListView android: android:layout_width='match_parent' android:layout_height='match_parent'/> <com.xinrui.headsettest.arc.SatelliteView android: android:layout_width='match_parent' android:layout_height='match_parent'> <RelativeLayout android:layout_width='wrap_content' android:layout_height='wrap_content'> <ImageViewandroid:layout_width='wrap_content'android:layout_height='wrap_content'android:layout_centerInParent='true'android:src='http://m.b3g6.com/bcjs/@drawable/menu' /> </RelativeLayout> <ImageView android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://m.b3g6.com/bcjs/@drawable/camera' /> <ImageView android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://m.b3g6.com/bcjs/@drawable/chat' /> <ImageView android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://m.b3g6.com/bcjs/@drawable/contacts' /> <ImageView android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://m.b3g6.com/bcjs/@drawable/music' /> <ImageView android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://m.b3g6.com/bcjs/@drawable/moon' /> <ImageView android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://m.b3g6.com/bcjs/@drawable/location' /> </com.xinrui.headsettest.arc.SatelliteView></RelativeLayout>

4.anim動畫 在res 新建anim文件夾

satellite_anim.xml

<?xml version='1.0' encoding='utf-8'?><set xmlns:android='http://schemas.android.com/apk/res/android'> <rotate android:duration='300' android:fromDegrees='0' android:toDegrees='360' android:pivotX='50%' android:pivotY='50%'/></set>

bigalpha.xml

<!--android:fillAfter='true'得加,取動畫結束后的最后一幀--><set xmlns:android='http://schemas.android.com/apk/res/android' android:fillAfter='true'> <alpha android:duration='200' android:fromAlpha='1' android:toAlpha='0'/> <scale android:duration='200' android:fromXScale='1' android:fromYScale='1' android:toXScale='3' android:toYScale='3' android:pivotX='50%' android:pivotY='50%' /></set>

smallalpha.xml

<!--android:fillAfter='true'得加,取動畫結束后的最后一幀--><set xmlns:android='http://schemas.android.com/apk/res/android' android:fillAfter='true'> <alpha android:duration='200' android:fromAlpha='1' android:toAlpha='0'/> <scale android:duration='200' android:fromXScale='1' android:fromYScale='1' android:toXScale='0' android:toYScale='0' android:pivotX='50%' android:pivotY='50%' /></set>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
模特精品在线| av资源亚洲| 久久久精品网| 美女久久久久久| 免费日韩成人| 国产一区二区三区四区二区| 国产在线一区不卡| 精品伊人久久| 国产自产自拍视频在线观看| 在线天堂中文资源最新版| 特黄毛片在线观看| 久久香蕉国产| 久色成人在线| 奇米色欧美一区二区三区| 欧美午夜三级| 麻豆视频久久| 日韩高清不卡| 久久av一区| 最新国产精品| 欧美天堂一区| 精品一区二区三区中文字幕 | 久久gogo国模啪啪裸体| 国产精品一区二区三区美女| 国产一区二区三区久久| 特黄特色欧美大片| 视频一区中文字幕| 国产亚洲欧美日韩在线观看一区二区 | 免费观看在线综合色| 婷婷精品在线| 国语对白精品一区二区| 亚洲高清成人| 97久久亚洲| 中文字幕系列一区| 老司机久久99久久精品播放免费| 91九色综合| 国产日韩电影| 日韩中文字幕1| 国产精品videossex久久发布| 91亚洲国产高清| 在线亚洲自拍| 国产极品嫩模在线观看91精品| 色综合狠狠操| 亚洲欧美不卡| 美女视频黄 久久| 欧美精品一线| 国产精品亚洲欧美一级在线| 999国产精品999久久久久久| 日韩精品一区二区三区中文字幕| 精品久久网站| 亚洲一区二区三区高清| 国产乱子精品一区二区在线观看| 日韩中文欧美| 日韩高清二区| 亚洲va在线| 欧美天堂一区二区| 欧美日韩高清| 久久av网址| 免费欧美日韩| 精品国产免费人成网站| 免费美女久久99| 中文字幕一区久| 日韩不卡一二三区| 一区二区小说| 久久精品国产网站| 亚洲毛片一区| 日韩高清不卡| 国产精品久久亚洲不卡| 一区二区视频欧美| 国内揄拍国内精品久久| 日韩在线一二三区| 亚洲天堂一区二区| 国产亚洲欧美日韩精品一区二区三区 | 国产精品午夜一区二区三区| 欧美性感美女一区二区| 日本强好片久久久久久aaa| 欧美 日韩 国产一区二区在线视频 | 欧美日韩一区二区三区不卡视频 | 精品视频自拍| 亚洲综合婷婷| 欧美精品一区二区三区精品| av在线最新| 久久精品免费看| 日韩av字幕| 亚洲精品乱码日韩| 午夜久久tv| 亚洲综合在线电影| 麻豆精品99| 清纯唯美亚洲综合一区| 日韩精品一二三四| 欧美日韩精品一本二本三本 | 久久精品一本| 日韩和欧美一区二区| 国产精品外国| 亚洲福利专区| 久久天堂av| 超级白嫩亚洲国产第一| 欧美国产先锋| 欧美影院精品| 亚洲精品麻豆| 亚洲欧洲午夜| 欧美午夜精彩| 99精品视频在线| 粉嫩av一区二区三区四区五区 | 水蜜桃久久夜色精品一区的特点| 久久久久久久久丰满| 欧美男人天堂| 亚洲国产福利| 国产一区精品福利| 国产一区丝袜| 狠狠久久伊人| 国产一区一一区高清不卡| 久久免费精品| 蜜桃精品视频| 国产亚洲欧美日韩精品一区二区三区 | 国产毛片精品| 国产伦乱精品| 国产精品综合色区在线观看| 国产欧美日韩在线观看视频 | 欧美精品aa| 国产毛片一区二区三区| 国产精品久久久久久模特 | 一区久久精品| 亚洲电影在线| 91九色精品| 国产精品日本| 久久不射网站| 日韩精品1区2区3区| 日韩国产在线观看一区| 国产欧美日韩免费观看| 精品国产一区二区三区av片| 精品国产aⅴ| 天堂中文在线播放| 日韩国产激情| 国产精品99一区二区| 久久精品动漫| 亚洲国产成人精品女人| av不卡免费看| 日韩一区网站| 国产精品一区高清| av中文字幕在线观看第一页| 日韩精品影视| 亚洲免费高清| 亚洲另类视频| 欧美午夜三级| а√天堂8资源在线| 国产高清一区二区| 首页国产欧美久久| 中文字幕av一区二区三区人| 日韩国产一二三区| 久久永久免费| 日韩不卡在线| 亚洲欧美日韩一区在线观看| 视频一区日韩精品| 嫩草伊人久久精品少妇av杨幂| 91一区二区| 黄色日韩在线| 日韩一区二区三免费高清在线观看 | 久久精品99国产精品日本| 国产日韩一区二区三区在线| 久久av日韩| 99tv成人| 日韩国产在线观看| 超碰成人av| 国产亚洲网站| 欧美日韩在线精品一区二区三区激情综合| 精品国产精品国产偷麻豆| 午夜影院欧美| 婷婷成人av| 国产成人77亚洲精品www| 免费看av不卡| 免费中文字幕日韩欧美| 国产精品高清一区二区| 波多野结衣久久精品| 男人天堂欧美日韩| 国产精品高潮呻吟久久久久| 久久精品国产99久久| 午夜电影一区| av综合电影网站| 亚洲精品视频一二三区| 精品国产美女a久久9999| 国产偷自视频区视频一区二区| 国产精品xxx在线观看| 99热精品在线观看| 精品国产a一区二区三区v免费| 国产99久久| 国产无遮挡裸体免费久久| 久久久亚洲一区| 国产欧美日本| 欧美网站在线| 国产成人免费av一区二区午夜| 久久成人亚洲| 欧美激情国产在线| 日本麻豆一区二区三区视频| 免费欧美一区| 精品三级在线观看视频| 亚洲天堂av资源在线观看| 国产 日韩 欧美一区| 国产精品va视频| 视频一区二区不卡| 亚洲黄色免费看|