组合控件2——海贼王选项菜单

之前的自定义控件——初识自定义控件,我们了解到了自定义控件分为三种,自制控件,组合控件,拓展控件。
而我们在自制控件1 开关按钮自制控件2 —— 自制控件 仿qq侧滑菜单

组合控件1—— 设置框一文中,我们也对设置框(组合控件)完成了demo编写

接下来,还是进行组合控件的编写。

一、弄出界面

先准备一个项目xml布局文件
后把这个xml填充进当前的自定义控件

diy_op_view

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="170dp"
    android:layout_height="170dp"
    android:padding="10dp"
    >
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mRlOutLayout"
        android:layout_width="150dp"
        android:layout_height="150dp"
        >
        <ImageView
            android:id="@+id/mIvLeftTop"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@mipmap/op_hkk"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            />
        <ImageView
            android:id="@+id/mIvTop"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@mipmap/op_qb"
            android:layout_centerHorizontal="true"
            android:layout_alignParentTop="true"
            />
        <ImageView
            android:id="@+id/mIvRightTop"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@mipmap/op_xj"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            />
        <ImageView
            android:id="@+id/mIvLeft"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@mipmap/op_sl"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            />
        <ImageView
            android:id="@+id/mIvRight"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@mipmap/op_nm"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            />
        <ImageView
            android:id="@+id/mIvLfetBottom"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@mipmap/op_lb"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            />
        <ImageView
            android:id="@+id/mIvBottom"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@mipmap/op_wsp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            />
        <ImageView
            android:id="@+id/mIvRightBottom"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@mipmap/op_blk"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            />
    </RelativeLayout>
    <ImageView
        android:id="@+id/mIvcCenter"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@mipmap/op_lf"
        android:layout_centerInParent="true"
        />
</RelativeLayout>
4184943.png

OpExpandView

public class OpExpandView extends RelativeLayout {
    public OpExpandView(Context context) {
        super(context);
        initUI(context);
    }
    public OpExpandView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initUI(context);
    }
    public OpExpandView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initUI(context);
    }
    private void initUI(Context context){
        View.inflate(context, R.layout.diy_op_view,this);
    }
}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#66c9bcbc"
    tools:context="com.amqr.diyviewone.MainActivity">
    <com.amqr.diyviewone.View.OpExpandView
        android:id="@+id/mOpExpand"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        />
</RelativeLayout>

MainActivity

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
运行效果.png

.
.

二、做一些动画

接下来我们来做一个简单的缩放动画,从展开状态,切换到只显示最中间一个ImageView的状态。

我们这里采用属性动画做,为了让动画缩放过程明显,我们播放动画的时间设定为2000毫秒。(原生自带android3.0以才可以使用属性动画,有兴趣的可以切换为补间动画或者采用开源库)

附上代码:

二.1、简单缩放

public class OpExpandView extends RelativeLayout implements View.OnClickListener {

    private RelativeLayout mRlOut;

    private ImageView mIvcCenter;

    public OpExpandView(Context context) {

        super(context);

        initUI(context);

    }

    public OpExpandView(Context context, AttributeSet attrs) {

        super(context, attrs);

        initUI(context);

    }

    public OpExpandView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        initUI(context);

    }

    private void initUI(Context context){

        View.inflate(context, R.layout.diy_op_view,this);

        // 因为父视图是this,也就是OpExpandView,所以直接findViewById

        mRlOut = (RelativeLayout) findViewById(R.id.mRlOut);

        mIvcCenter = (ImageView) findViewById(R.id.mIvcCenter);

        mIvcCenter.setOnClickListener(this);

    }

    @Override

    public void onClick(View v) {

        switch (v.getId()){

            // 点击中间的ImageView

            case R.id.mIvcCenter:

                scaleGeneral(mIvcCenter,2000,"scaleX",1.0f,0.0f);

                scaleGeneral(mIvcCenter,2000,"scaleY",1.0f,0.0f);

                break;

        }

    }

    /**

     * 缩放属性动画

     * @param view  要做缩放动画的View

     * @param time  毫秒值

     * @param objectName   缩放的类型,按照X还是Y

     * @param start  开始的比例

     * @param end 结束的比例

     */

    private void scaleGeneral(View view,int time,String objectName,float start,float end){

        ObjectAnimator scale = ObjectAnimator.ofFloat(mRlOut,objectName,start,end);

        // 属性动画android 3.0 api 11才支持。这里就不做版本兼容了。有兴趣可换成补间动画

        scale.setDuration(time);

        scale.start();

    }

}
简单缩放.gif

二.2、加上渐变,旋转,已经boolean展示判断,定义子选项的回调

public class OpExpandView extends RelativeLayout implements View.OnClickListener {
    private RelativeLayout mRlOut;
    private ImageView mIvcCenter;
    private ImageView mIvLeftTop;
    private ImageView mIvTop;
    private ImageView mIvRightTop;
    private ImageView mIvLeft;
    private ImageView mIvRight;
    private ImageView mIvLfetBottom;
    private ImageView mIvBottom;
    private ImageView mIvRightBottom;
    private boolean isHide = false;
    private ItemClickListener itemClickListener;
    public void setItemClickListener(ItemClickListener itemClickListener){
        this.itemClickListener = itemClickListener;
    }
    public OpExpandView(Context context) {
        super(context);
        initUI(context);
    }
    public OpExpandView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initUI(context);
    }
    public OpExpandView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initUI(context);
    }
    private void initUI(Context context){
        View.inflate(context, R.layout.diy_op_view, this);
        // 因为父视图是this,也就是OpExpandView,所以直接findViewById
        mRlOut = (RelativeLayout) findViewById(R.id.mRlOut);
        mIvcCenter = (ImageView) findViewById(R.id.mIvcCenter);
        mIvcCenter.setOnClickListener(this);
        //子项
        mIvTop = (ImageView) findViewById(R.id.mIvTop);mIvTop.setOnClickListener(this);
        mIvLeft = (ImageView) findViewById(R.id.mIvLeft);mIvLeft.setOnClickListener(this);
        mIvRight = (ImageView) findViewById(R.id.mIvRight);mIvRight.setOnClickListener(this);
        mIvBottom = (ImageView) findViewById(R.id.mIvBottom);mIvBottom.setOnClickListener(this);
        mIvLfetBottom = (ImageView) findViewById(R.id.mIvLfetBottom);mIvLfetBottom.setOnClickListener(this);
        mIvLeftTop = (ImageView) findViewById(R.id.mIvLeftTop);mIvLeftTop.setOnClickListener(this);
        mIvRightTop = (ImageView) findViewById(R.id.mIvRightTop);mIvRightTop.setOnClickListener(this);
        mIvRightBottom = (ImageView) findViewById(R.id.mIvRightBottom);mIvRightBottom.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            // 点击中间的ImageView
            case R.id.mIvcCenter:
                if(isHide){
                    scaleGeneral(mRlOut,2000,"scaleX",1.0f,0.0f);
                    scaleGeneral(mRlOut, 2000, "scaleY", 1.0f, 0.0f);
                    rotateGeneral(mRlOut, 2000, "rotationX", 1.0f, 180f);
                    rotateGeneral(mRlOut,2000,"rotationY",1.0f,180f);
                    alphaGeneral(mRlOut, 2000, "alpha", 1.0f, 0.0f);
                }else{
                    scaleGeneral(mRlOut,2000,"scaleX",0.0f,1.0f);
                    scaleGeneral(mRlOut, 2000, "scaleY", 0.0f, 1.0f);
                    rotateGeneral(mRlOut, 2000, "rotationX", 180f, 1.0f);
                    rotateGeneral(mRlOut,2000,"rotationY",180f,1.0f);
                    alphaGeneral(mRlOut, 2000, "alpha", 0.0f, 1.0f);
                }
                isHide = !isHide;
                break;
            case R.id.mIvRight:
                itemClickListener.rightClick(mIvRight);
                break;
            case R.id.mIvTop:
                itemClickListener.topClick(mIvTop);
                break;
            case R.id.mIvLeft:
                itemClickListener.leftClick(mIvLeft);
                break;
            case R.id.mIvBottom:
                itemClickListener.bottomClick(mIvBottom);
                break;
            case R.id.mIvLeftTop:
                itemClickListener.leftTopClick(mIvLeftTop);
                break;
            case R.id.mIvRightTop:
                itemClickListener.rightTopClick(mIvRightTop);
                break;
            case R.id.mIvLfetBottom:
                itemClickListener.leftBottomClick(mIvLfetBottom);
                break;
            case R.id.mIvRightBottom:
                itemClickListener.rightBottomClick(mIvRightBottom);
                break;
        }
    }
    /**
     * 缩放属性动画
     * @param view  要做缩放动画的View
     * @param time  毫秒值
     * @param objectName   缩放的类型,按照X还是Y
     * @param start  开始的比例
     * @param end 结束的比例
     */
    private void scaleGeneral(View view,int time,String objectName,float start,float end){
        ObjectAnimator scale = ObjectAnimator.ofFloat(view,objectName,start,end);
        // 属性动画android 3.0 api 11才支持。这里就不做版本兼容了。有兴趣可换成补间动画
        scale.setDuration(time);
        scale.start();
    }
    /**
     * 旋转动画
     * @param view
     * @param time
     * @param objectName
     * @param start
     * @param end
     */
    private void rotateGeneral(View view,int time,String objectName,float start,float end){
        ObjectAnimator rotate = ObjectAnimator.ofFloat(view,objectName,start,end);
        rotate.setDuration(time);
        rotate.start();
    }
    /**
     * 透明度动画
     * @param view
     * @param time
     * @param objectName
     * @param start
     * @param end
     */
    private void alphaGeneral(View view,int time,String objectName,float start,float end){
        ObjectAnimator alpha = ObjectAnimator.ofFloat(view,objectName,start,end);
        alpha.setDuration(time);
        alpha.start();
    }
    // 造一个回调接口
    public interface ItemClickListener{
        void topClick(ImageView imageView);
        void leftClick(ImageView imageView);
        void rightClick(ImageView imageView);
        void bottomClick(ImageView imageView);
        void leftTopClick(ImageView imageView);
        void leftBottomClick(ImageView imageView);
        void rightTopClick(ImageView imageView);
        void rightBottomClick(ImageView imageView);
    }
    
}

MainActivity

public class MainActivity extends Activity {
    private OpExpandView opExpandView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        opExpandView = (OpExpandView) findViewById(R.id.mOpExpand);
        // 利用自定义控件的 setItemClickListener 方法实现接口,让调用者自己决定点击事件做什么事。
        opExpandView.setItemClickListener(new OpExpandView.ItemClickListener() {
            @Override
            public void topClick(ImageView imageView) {
                Toast.makeText(MainActivity.this,"顶部Top",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void leftClick(ImageView imageView) {
                Toast.makeText(MainActivity.this,"左边",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void rightClick(ImageView imageView) {
                Toast.makeText(MainActivity.this,"右",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void bottomClick(ImageView imageView) {
                Toast.makeText(MainActivity.this,"底部",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void leftTopClick(ImageView imageView) {
                Toast.makeText(MainActivity.this,"左上",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void leftBottomClick(ImageView imageView) {
                Toast.makeText(MainActivity.this,"左下",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void rightTopClick(ImageView imageView) {
                Toast.makeText(MainActivity.this,"右上",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void rightBottomClick(ImageView imageView) {
                Toast.makeText(MainActivity.this,"右下",Toast.LENGTH_SHORT).show();
            }
        });
    }
}
最终效果.gif

本文的描述到此为止,在拓展控件——拓展TextView一文中,我们对拓展控件进行一个简单的博文描述。

本篇完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,754评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,059评论 4 62
  • 10 我很是遗憾没能早点认识小汤同学,也没能早点意识到我对他的不轨之心。 等我意识到以后,小汤同学已经去了金融,和...
    阿止ZHI阅读 386评论 0 0
  • 时间回到2013年5月初 原本计划走滇藏线进藏,在抵达香格里拉(中甸)后,却发生变化,因为想去被国际友人誉为“地球...
    阿盲拾荒阅读 667评论 5 7
  • 哥哥们完成作业之后,一起在电脑上看什么《变形金刚》,我也看不懂!于是我找来一张A4纸,准备画画玩!我可喜欢画画...
    快乐舒馨阅读 244评论 0 1