一個點(diǎn)擊展開的控件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/widget33"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
    <ImageView
        android:id="@+id/img_menu"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/set_icon_3"/>

    <ImageView
        android:id="@+id/img_menu1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/set_icon_4"
        android:visibility="gone"/>

    <ImageView
        android:id="@+id/img_menu2"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/set_icon_1"
        android:visibility="gone"/>

    <ImageView
        android:id="@+id/img_menu3"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/set_icon_4"
        android:visibility="gone"/>

    <ImageView
        android:id="@+id/img_menu4"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/set_icon_1"
        android:visibility="gone"/>

    <ImageView
        android:id="@+id/img_menu5"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/set_icon_4"
        android:visibility="gone"/>

</RelativeLayout>

這個是自定義類

public class ArcMenu {
    private Activity context;
    private int[] imageRes;
    private List<ImageView> imageViewList = new ArrayList<>();
    private boolean isShowMenu = false;
    int radius = 180;
    double angle;
    public ArcMenu(Activity context, int[] imageRes) {
        angle = Math.PI / 2 / (imageRes.length - 2);
        radius = Tool.dip2px(context, radius);
        this.context = context;
        this.imageRes = imageRes;
        for (int imagRe : imageRes) {
            ImageView imageView = (ImageView) context.findViewById(imagRe);
            imageViewList.add(imageView);
        }
    }

    private void openMenu() {
        isShowMenu = true;
        setItemVisible(true);
        ObjectAnimator animator1;
        ObjectAnimator animator2;
        List<ObjectAnimator> objectAnimators = new ArrayList<>();
        AnimatorSet set = new AnimatorSet();

        for (int i = 1; i < imageRes.length; i++) {
            animator1 = ObjectAnimator.ofFloat(imageViewList.get(i), "translationX", (float) (-radius * Math.sin(angle * (i - 1))));
            animator2 = ObjectAnimator.ofFloat(imageViewList.get(i), "translationY", (float) (-radius * Math.cos(angle * (i - 1))));
            objectAnimators.add(animator1);
            objectAnimators.add(animator2);
        }

        for (int i = 0; i < objectAnimators.size(); i++) {
            set.playTogether(objectAnimators.get(i));
        }
        set.setDuration(200);
        set.start();
        //第0個圖標(biāo)荷腊,菜單圖標(biāo)浆劲,加入動畫
        ObjectAnimator.ofFloat(imageViewList.get(0), "rotation", 0, 135f).setDuration(200).start();
    }

    private void closeMenu() {
        isShowMenu = false;
        ObjectAnimator animator1 = null;
        ObjectAnimator animator2;
        List<ObjectAnimator> objectAnimators = new ArrayList<>();
        AnimatorSet set = new AnimatorSet();

        for (int i = 1; i < imageRes.length; i++) {
            animator1 = ObjectAnimator.ofFloat(imageViewList.get(i), "translationX", 0);
            animator2 = ObjectAnimator.ofFloat(imageViewList.get(i), "translationY", 0);
            objectAnimators.add(animator1);
            objectAnimators.add(animator2);
        }

        animator1.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                setItemVisible(false);
                super.onAnimationEnd(animation);
            }
        });

        for (int i = 0; i < objectAnimators.size(); i++) {
            set.playTogether(objectAnimators.get(i));
        }

        set.setDuration(200);
        set.start();
        ObjectAnimator.ofFloat(imageViewList.get(0), "rotation", 135f, 0).setDuration(200).start();
    }

    public void switchMenu() {
        if (isShowMenu) {
            closeMenu();
        } else {
            openMenu();
        }
    }

    public void clickItem() {
        setItemVisible(false);
        closeMenu();
    }

    private void setItemVisible(boolean isVisible) {
        for (int i = 1; i < imageRes.length; i++) {
            if (isVisible) {
                imageViewList.get(i).setVisibility(View.VISIBLE);
            } else {
                imageViewList.get(i).setVisibility(View.GONE);
            }
        }
    }
}

MainActivity類是這樣的.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ArcMenu mArcMenu;
    private int[] imageRes = {R.id.img_menu, R.id.img_menu1,
            R.id.img_menu2, R.id.img_menu3, R.id.img_menu4, R.id.img_menu5};

    private ImageView mImgMenu;
    private ImageView mImgMenu1;
    private ImageView mImgMenu2;
    private ImageView mImgMenu3;
    private ImageView mImgMenu4;
    private ImageView mImgMenu5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mArcMenu = new ArcMenu(this, imageRes);
        mImgMenu = (ImageView) findViewById(R.id.img_menu);

        mImgMenu1 = (ImageView) findViewById(R.id.img_menu1);
        mImgMenu2 = (ImageView) findViewById(R.id.img_menu2);
        mImgMenu3 = (ImageView) findViewById(R.id.img_menu3);
        mImgMenu4 = (ImageView) findViewById(R.id.img_menu4);
        mImgMenu5 = (ImageView) findViewById(R.id.img_menu5);

        mImgMenu.setOnClickListener(this);
        mImgMenu1.setOnClickListener(this);
        mImgMenu2.setOnClickListener(this);
        mImgMenu3.setOnClickListener(this);
        mImgMenu4.setOnClickListener(this);
        mImgMenu5.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.img_menu:
                mArcMenu.switchMenu();
                break;
            case R.id.img_menu1:
                mArcMenu.clickItem();
                break;
            case R.id.img_menu2:
                mArcMenu.clickItem();
                break;
            case R.id.img_menu3:
                mArcMenu.clickItem();
                break;
            case R.id.img_menu4:
                mArcMenu.clickItem();
                break;
            default:
                break;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迟赃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子午绳,更是在濱河造成了極大的恐慌紧帕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異珠漂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尾膊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門媳危,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冈敛,你說我怎么就攤上這事待笑。” “怎么了抓谴?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵暮蹂,是天一觀的道長。 經(jīng)常有香客問我癌压,道長仰泻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任措拇,我火速辦了婚禮我纪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丐吓。我一直安慰自己浅悉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布券犁。 她就那樣靜靜地躺著术健,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粘衬。 梳的紋絲不亂的頭發(fā)上荞估,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音稚新,去河邊找鬼勘伺。 笑死,一個胖子當(dāng)著我的面吹牛褂删,可吹牛的內(nèi)容都是我干的飞醉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屯阀,長吁一口氣:“原來是場噩夢啊……” “哼缅帘!你這毒婦竟也來了轴术?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钦无,失蹤者是張志新(化名)和其女友劉穎逗栽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體失暂,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彼宠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弟塞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兵志。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宣肚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悠栓,我是刑警寧澤霉涨,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惭适,受9級特大地震影響笙瑟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜癞志,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一往枷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凄杯,春花似錦错洁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膊存,卻和暖如春导而,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隔崎。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工今艺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爵卒。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓虚缎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親技潘。 傳聞我的和親對象是個殘疾皇子遥巴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容