组合控件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一文中,我们对拓展控件进行一个简单的博文描述。

本篇完。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值