day53_自定义控件第01天

01_View和ViewGroup的介绍

  1. 原生控件
  2. 自定义控件
    1. 组合控件
    2. 自己绘制控件(绘制 + 行为)

 

View和ViewGroup

 

关系:View和ViewGroup

  1. 继承关系

  2. 组合关系

 

  1. 作用

View的直系分支:绘制图形

ViewGroup:管理控件(也可以绘制)

 

属性中以layout开始的都是对父容器的要求

02_广告_布局的实现

  1. 功能分析:

  2. 滑动时圆点的切换
  3. 滑动时切换图片
  4. 滑动文本的切换
  5. 无限滑动

 

ViewPager:support.v4包中的控件

 

轮播图的布局:

RelativeLayout

    ImageViewView

LinearLayout

            TextView

            LinearLayout

                    View

 

 

03_源码关联

 

  1. 移除依赖 --》 Build Path --》libraries --》移除 Android Dependency
  2. 选中libs下的jar--》build Path
  3. 关联源码:attach source(Viewpager) --》SDK下的extras--》Android --》 support
  4. 右键项目 --> android tools --> fix project properties

 

04_广告_ViewPager的Adapter

// 页面的数量

        @Override

        publicint getCount() {

 

// 标记方法,用来判断缓存标记

@Override

        publicboolean isViewFromObject(View arg0, Object arg1) {

// view :显示的View

            // object标记

            // 判断有没有缓存

 

 

// 初始化item

        @Override

        public Object instantiateItem(ViewGroup container, int position) {

// 用来添加要显示的View

            

            

            // 记录缓存标记 -- return 标记(标记可以自己指定)

 

 

@Override

        publicvoid destroyItem(ViewGroup container, int position, Object object) {

// 销毁移除的item

            // object标记

05_ViewPager_加载的流程

 

 

06_广告_数据的加载

// 设置适配器 --- 自己实现adapter ---集合list< 数据 >依赖于数据

 

public int getCount() {

            if (mListDatas != null) {

                returnmListDatas.size();

            }

            return 0;

        }

    

public Object instantiateItem {

            ImageView iv = mListDatas.get(position);

            

            // 用来添加要显示的View

            mPager.addView(iv);

}

 

移除

ImageView iv = mListDatas.get(position);

            mPager.removeView(iv);

 

07_ViewPager回调方法的介绍

参数:

向谁里添加view就要new出他标准的params

 

 

 

VIewPager的事件监听:

mPager.setOnPageChangeListener(this);

 

 

// 回调方法,当viewpager的某个页面选中时的回调

    @Override

    publicvoid onPageSelected(int position) {

 

 

// 回调方法,当ViewPager滚动时回调

    @Override

    publicvoid onPageScrolled(

// position :当前选中的位置

        // positionOffset:滑动的百分比

        // positionOffsetPixles:滑动的像素

 

 

 

08_广告_文本和点的选中处理

 

09_广告_无限滑动的实现

viewpager缓存:最多三个

设置页面缓存的数量(左右两侧):

public void setOffscreenPageLimit(int limit) {

通过limit设置

 

无限滑动:

 

设置页面的数量为无限

 

 

每个牵扯到position的方法都需要取模

 

 

10_优酷_布局的实现

 

View的形状:方形

 

控件的拆分:

 

布局的层次:

使用相对布局

后布局的在最外面一层

 

  1. 最大
  2. 中间
  3. 最小

 

11_优酷_home按钮点击的逻辑

功能分析

  1. 内侧的home按钮的点击

 

通过两个boolean 类型的变量记录两个菜单的状态,每次状态改变时同时改变这两个变量

设置home 按钮的点击事件:三种状态

  1. 二级和三级都显示——全部隐藏
  2. 二级显示,三级不显示——全部隐藏
  3. 二级和三级都隐藏——显示二级

 

12_优酷_显示隐藏动画的实现

 

给组件设置一个旋转动画

/**

* 隐藏菜单

* @param container

*/

private void hideLevel(RelativeLayout container,long startOffset){

RotateAnimation animation = new RotateAnimation(0,-180,

RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,1f);

 

animation.setDuration(600);

animation.setFillAfter(true); // 保持播放完的状态

animation.setStartOffset(startOffset);// 设置动画延时执行

 

container.startAnimation(animation);

 

 

}

 

 

通过设置animation.setStartOffset(startOffset);,使两个菜单播放的先后不同

13_优酷_二级菜单按钮的实现

 

添加监听事件

 

14_优酷_动画播放的Bug解决

 

有动画在执行的时候不要触发点击事件

 

在两个播放动画的按钮监听事件上面,执行动画前面做一个判断

在动画上添加一个监听事件

animation.setAnimationListener(new AnimationListener(){

    @Override

            publicvoid onAnimationStart(Animation animation) {

// 动画开始播放的回调方法

                mAnimationCount++; // 当前有几个动画在播放

 

 

@Override

            publicvoid onAnimationEnd(Animation animation) {

                // 动画结束播放的回调方法

                mAnimationCount--;

            }

})

15_优酷_硬件菜单按钮的实现

 

接收硬件的点击事件

@Override

    publicboolean onKeyUp(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_MENU) {

            // 点击的是menu按钮

            Log.d(TAG, "点击了硬件的menu");

 

            clickHardwareMenu();

 

            // 消费menu点击事件

            returntrue;

        }

 

        returnsuper.onKeyUp(keyCode, event);

    }

 

处理硬件的点击事件,

  1. 三个都不可见
  2. 三个都可见
  3. 三不可见,一二可见
  4. 二三不可见,一可见

    privatevoid clickHardwareMenu() {

        // 如果三个菜单都可见,隐藏三个菜单

        if (isLevel1Display && isLevel2Display && isLevel3Display) {

            hideLevel(mRlLevel3, 0);

            hideLevel(mRlLevel2, 100);

            hideLevel(mRlLevel1, 200);

 

            // 改变状态

            isLevel1Display = false;

            isLevel2Display = false;

            isLevel3Display = false;

 

            return;

        }

 

16_属性动画的简单介绍

动画操作:

  1. ViewAnimation:补间动画

    旋转,位移,缩放,透明度,set

    1. 原理

      通过父容器来绘制自己动画时的样子

      实际控件本身并没有移动

 

  1. property Animation:属性动画(补间动画可以做到的,都可以做到,做不到的他也可以做到)
    1. 原理 (Android 3.0之后的)

      改变自身的属性来显示动画的

      调用自身的可以设置属性的方法来改变属性

       

       

类:

    ObjectAnimator

    ofFloat,ofInt,ofObject

 

 

  1. Drawable Animation:帧动画

 

 

17_优酷_菜单View的封装

 

解决点击菜单BUG

int count = container.getChildCount();

        for (int i = 0; i < count; i++) {

            container.getChildAt(i).setEnabled(false);

        }

 

封装:

Activity和View都有OnkeyUp()方法

View.inflate()

    // Xmlclass绑定,this表示这个view填充整个布局

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

    // 将所有的点击事件传递给这个view

        setFocusableInTouchMode(true);

 

主Activity:设置布局文件即可

在主Activity中向view类中的控件设置监听事件

DemoActivity.java

 

YoukuView.java

 

 

18_下拉_布局的实现

 

shape:圆角矩形

corners:半径

stroke:边框

padding:边框距离

 

19_下拉_弹出层的添加

 

20_下拉_adapter的新建

 

将textview替换成listview

 

21_下拉_功能的实现

功能:

  1. 添加数据到listview
  2. 设置点击删除事件:移除数据即可,然后更新UI

  3. 设置点击item添加数据到输入框:隐藏组件方法:dismiss

 

22_下拉_封装

 

将数据和view分开,即Activity和view分开

 

DemoActivity.java(数据)

classMyAdapterextends BaseAdapter {

 

class ViewHolder {

 

设置点击事件,通过方法调用view设置view里面的点击事件(不能直接设置)

@Override

    publicvoid onItemClick(AdapterView<?> parent, View view, int position,

            long id) {

 

        // 设置输入框内容

        String data = mDatas.get(position);

        mSpinnerView.setText(data);

        mSpinnerView.setSelection(data.length());

 

        // 隐藏popu

        mSpinnerView.dismiss();

 

    }

SpinnerView.java

设置view

 

23_view的绘制原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值