android 自定义控件(持续更新)

来源:互联网 发布:视频动态截图软件 编辑:程序博客网 时间:2024/05/16 07:56

自定义控件分为两种

  • 1组合控件:将系统原生控件组合起来加上动画效果,形成一种特殊的动画效果。
  • 2完全自定义控件,继承自系统的View,自己去实现View效果

RotateAnimation

构造函数参数含义
  • fromDegrees
    从哪个角度开始旋转
  • toDegrees
    到哪个角度结束
  • pivotXType
    X轴以什么为参考
  • pivotXValue
    x轴以哪里为中心,是一个0~1的浮点数
  • pivotYType
    Y轴以什么为参考
  • pivotYValue
    y轴以哪里为中心,是一个0~1的浮点数


如何在动画完成后保持状态

animation.setFillAfter(true);

设置动画持续时间

animation.setDuration(1000);    //持续1s

还可以给动画添加监听事件

animation.setAnimationListener(new Animation.AnimationListener() {        @Override        public void onAnimationStart(Animation animation) {        }        @Override        public void onAnimationEnd(Animation animation) {        }        @Override        public void onAnimationRepeat(Animation animation) {        }    });

添加动画时可能出现的bug

  • 动画完成后已经消失的view,点击原位置还会触发点击事件,这是由于Android原生动画执行后view的位置不发生改变,所以如果想解决此bug就要在view消失的时候禁用,例如 button.setEnabled(false);


如何获取物理按键的点击事件

@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {    if(keyCode == KeyEvent.KEYCODE_MENU){        //然后做自己的处理        return true;    //return true代表我们自己处理这个响应    }    return super.onKeyDown(keyCode, event);}

下拉列表(和QQ登陆那个一点用户名出现用户列表一样)

使用PopupWindow作为弹窗

我们一般使用三个参数的构造函数

PopupWindow popupWindow = new PopupWindow(View contentView, int width, int height);

参数含义

  • contentView :代表我们想让它显示的view
  • width : 弹窗的宽
  • height : 弹窗的高

显示popupWindow

popupWindow.showAsDropDown(View anchor,int xoff, int yoff);

参数含义

  • anchor : 代表在这个控件下面显示
  • xoff : 在x轴上的偏移量
  • yoff : 在y轴上的偏移量

去除listView的滚动条

当我们不想要listView的滚动条时我们可以这样做

listView.setVerticalScrollBarEnabled(false);

焦点问题

  • 假如listView的item中含有button,imageButton,checkBox等会强制获取焦点的view,此时listView无法获取焦点,因此无法被点击。
    解决方法:给item的根布局增加以下属性
    android:descendantFocusability=”blocksDescendants”

  • 当popupWindow中填充的View是ListView的话,如果不做设置,listView是无法获取焦点,所以也就无法响应点击事件,所以我们应该做如下设置

    popupWindow.setFocusable(true);
    popupWindow.setBackgroundDrawable(new BitmapDrawable());
    popupWindow.setOutsideTouchable(true);

动态改变popupWindow的宽高

假设popupWindow的高为300像素,当里面listView总的条目高小于300像素时,我们让popupWindow的高等于listView总条目的高

//这里的view代表当前listView的条目,list.size()是listView的条目数int listHeight = view.getHeight() * list.size();popupWindow.update(editText.getWidth(), listHeight < 300 ? listHeight : 300);


滑动开关

自定义控件步骤

  • 测量:onMeasure 设置自己显示在屏幕上的宽高
  • 布局:onLayout 设置自己显示在屏幕上的位置(只有在自定义ViewGroup中才用到)
  • 绘制:onDraw 控制显示在屏幕上的样子(自定义viewgroup时不需要这个)

View和ViewGroup的区别

1.他们都需要进行测量操作

2.ViewGroup主要是控制子view如何摆放,所以必须实现onLayout
View没有子view,所以不需要onLayout方法,但是必须实现onDraw

0 0
原创粉丝点击