为什么要自定义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