自定义View_01

为什么要自定义View?

因为原有控件无法达到我们想要的效果,所以我们需要自定义View去实现我们想要的效果

xml本质:

xml不是必须写,布局也可以代码写,xml最终会转成代码执行

1.View

View是用户界面一个组件(控件)
View是一个矩形
View的职责是绘制和事件处理

2.ViewGroup

ViewGroup是一个特殊的View,它继承自View
ViewGroup可包含其他View(孩子)
ViewGroup常用layout的基类
ViewGroup定义了孩子的布局参数(带layout_前缀的属性)

3.View和ViewGroup的关系有继承关系,和组合关系

什么是自定义View及类型

1. 原生控件:SDK已经有,Google提供
2. 自定义控件: 开发者自己开发的控件,分三种

a. 组合式控件:将现有控件进行组合,实现功能更加强大控件;
b. 继承现有控件: 对其控件的功能进行拓展;
c. 重写View实现全新的控件

1、下拉菜单

1.创建类继承布局(View,Lin...,R...)2个参数方法必须重写

public class SpinnerView extends RelativeLayout{


    private ImageView mIv;
    private TextView mTv;
    private PopupWindow pop;
    private ArrayList<String> data;

    public SpinnerView(Context context) {
        super(context);
    }

    /**
     *
     * @param context
     * @param attrs 所有属性封装后的对象
     */
    public SpinnerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        View view = LayoutInflater.from(context).inflate(R.layout.spinner_view, null,false);
        addView(view);
        initData();
        mTv = view.findViewById(R.id.tv_name);
        mIv = view.findViewById(R.id.iv_down_arrow);
        mIv.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showPop();
            }
        });


    }

    private void initData() {
        data = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            data.add("寒江雪");
        }
    }

    private void showPop() {
        if (pop==null){
            ListView listView = new ListView(getContext());
            pop = new PopupWindow(listView, ViewGroup.LayoutParams.MATCH_PARENT, 500);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1,data);
            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String s = data.get(position);
                    mTv.setText(s);
                    pop.dismiss();
                }
            });
        }
        pop.setBackgroundDrawable(new ColorDrawable());
        pop.setOutsideTouchable(true);
//        pop.showAtLocation(listView, Gravity.BOTTOM,0,0);
        pop.showAsDropDown(mTv,0,0);
    }

}

3.布局引用创建的View

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。