自定义控件--day01笔记

下拉框菜单的绘制

顺序步骤
    1. 编写UI
    2. 点击弹出popupwindow
        当点击向下箭头按钮时弹出PopUpWindown窗口
        自定义一个ListView
        ListView listView=new ListView(Context context);
        //第一个参数是:要显示包含的控件内容,第二参数是窗口的宽度,第三个参数是窗口的高度
        PopupWindown pw=new PopupWindoen(listview ,width,heght);
        // 设置焦点和背景,实现点击外部可以关闭对话框的效果
        mPopupWindow.setFocusable(true);
        mPopupWindow.setBackgroundDrawable(new ColorDrawable());
        // 让窗口在输入框下面
        mPopupWindow.showAsDropDown(mEd_input);
    3. 着手实现listView
    4. 关联上popupwindow
        1. PopupWindown pw=new PopupWindoen(listview ,width,heght);

    /*
     * 宽度是从布局里面获取的,实际上这个宽度就是match_parent 不带模式的int值
     * 高度就是图片的高度。 
     * 
     */ 
    >MeasureSpec.getSize(widthMeasureSpec)

ViewGrounp

望文生义就是View的容器

//绘画控件
@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
//  super.onDraw(canvas);
    //定义一个画笔
    Paint mPaint=new Paint();
    //画直线
    canvas.drawLine(0, 0, 0, -400, mPaint);
    //画圆
    mPaint.setColor(Color.BLUE);
    canvas.drawCircle(250, 250, 100, mPaint);
    //画空心圆--
    mPaint.setStyle(Paint.Style.STROKE);
    canvas.drawCircle(250, 250, 150, mPaint);
    //画图片
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.haha);
    canvas.drawBitmap(bitmap, 200, 300, mPaint);
    //画三角形
    //首先是要定义一个路径
    Path path = new Path();
    //设置一个点
    path.moveTo(150, 150);
    //从这个点连接到另外第二个点
    path.lineTo(200, 100);
    //从第二个点连接第三个点
    path.lineTo(250, 200);
    //连接原点
    path.lineTo(150, 150);
    //把它绘画出来
    canvas.drawPath(path, mPaint);
    //画扇形
    /*
     * 参数一:矩形 
     * 参数二: 开始的位置 圆心的x坐标方向过来就是0的位置 
     * 参数三:画过的角度
     * 参数四: true :有边, false :
     * 只会有弧形 参数五: 画笔
     */
    //获取矩形
     RectF mov=new RectF(200, 200, 200, 200);
    //画扇形
    canvas.drawArc(mov, 0, 45, true, mPaint);



}

自定义View滑动开关绘制

    /**
     * 自定义一个控件继承View
     * @author Administrator
     *
     */
>>布局
    <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"
    tools:context=".MainActivity" >
     <com.lxk.slidetoggle.view.SlideToggleView
    android:layout_centerInParent="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
</RelativeLayout>

>>代码部分
    public class SlideToggleView extends View implements OnClickListener {

     boolean isToggle = false;
    private Bitmap mBkBitmap1;
    private Bitmap mBitmap2;
    private Paint mPaint;

    public SlideToggleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //创建一个画笔
        mPaint = new Paint();

        //加载开关的按钮和背景图片
        mBkBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
        mBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.switch_button);

        //在自定义本事中监听本身控件,跟在付控件监听也是一样的
        setOnClickListener(this);
    }

    //设置控件的大小
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //super.onMeasure(200, 200);

        //这里设置为开关背景的长度和宽度,这样方便对开关按钮的位置处理
        setMeasuredDimension(mBkBitmap1.getWidth(), mBkBitmap1.getHeight());
    }

    //设置布局的位置,如果是一个View则不需要,因为在父控件已经定义好
    @Override
    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        // TODO Auto-generated method stub
        super.onLayout(changed, left, top, right, bottom);
    }

    //绘画
    @Override
    protected void onDraw(Canvas canvas) {
        // 
        //super.onDraw(canvas);

        if (isToggle) {
            canvas.drawBitmap(mBkBitmap1, 0, 0, mPaint);
            canvas.drawBitmap(mBitmap2, 0, 0, mPaint);
        } else {
            canvas.drawBitmap(mBkBitmap1, 0, 0, mPaint);
            canvas.drawBitmap(mBitmap2, getWidth()-mBitmap2.getWidth(), 0, mPaint);
        }


    }

    @Override
    public void onClick(View v) {

        if (isToggle) {//如果开关是开着则关上
            isToggle=false;

        } else {//如果开关是关着则打开
            isToggle=true;
        }
        //通过invalidate()再调用onDraw()一次--注意不能直接调用onDraw()
        invalidate();
    }

}

交叉布局

布局

<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"
tools:context=".MainActivity" >
<com.lxk.Grounp.view.CrossverView
    android:id="@+id/cv_rever"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<TextView
   android:layout_width="200dp"
    android:layout_height="50dp" 
    android:background="#8800FF00"/>
<TextView
   android:layout_width="200dp"
    android:layout_height="50dp" 
    android:background="#880000FF"/>
<TextView
    android:layout_width="200dp"
    android:layout_height="50dp" 
    android:background="#88FF0000"/>

</com.lxk.Grounp.view.CrossverView>
<Button
    android:textColor="#0000FF"
    android:text="recver"
    android:onClick="rever"
    android:layout_centerHorizontal="true"
    android:layout_alignParentBottom="true"
    android:id="@+id/bt_rever"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</RelativeLayout>


public class MainActivity extends Activity {
private CrossverView mCv_rever;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mCv_rever = (CrossverView) findViewById(R.id.cv_rever);
}

public void rever(View v){
    mCv_rever.revcer();
}

}

代码

    package com.lxk.Grounp.view;

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.ViewGroup;




public class CrossverView extends ViewGroup {

    boolean isToggle = false;
    private Paint mPaint;

public CrossverView(Context context, AttributeSet attrs) {
    super(context, attrs);
    //创建一个画笔
    mPaint = new Paint();


}

//设置自己布局的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // TODO Auto-generated method stub
    measureChildren(widthMeasureSpec, heightMeasureSpec);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

//设置布局的位置最主要的孩子
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    for (int i = 0; i < getChildCount(); i++) {
        //获取孩子元素
        View childView=getChildAt(i);
        int left;
        if (isToggle) {
            //从右边排起
            if (i%2==0) {
                //若是奇数则x坐标从getWidth()-childView.getMeasuredWidth()开始
                left=getWidth()-childView.getMeasuredWidth();
            } else {
                //如果是偶数则x坐标从0开始
                left=0;
            }
        } else {
            //默认从左边排起
            if (i%2==0) {
                //如果是偶数则x坐标从0开始
                left=0;
            } else {
                //若是奇数则x坐标从getWidth()-childView.getMeasuredWidth()开始
                left=getWidth()-childView.getMeasuredWidth();

            }
        }


        //设置孩子的坐标位置
        int top=i*childView.getMeasuredHeight();
        int right=left+childView.getMeasuredWidth();
        int bottom=top+childView.getMeasuredHeight();

        childView.layout(left, top, right, bottom);
    }

}
//绘画
@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);

}

//交换孩子位置
public void revcer() {
    if (isToggle) {
        isToggle=false;
    } else {
        isToggle=true;
    }

    //通过requestLayout();调用onDraw()方法--与 invalidate 用法几乎差不多,前者会调用onDraw方法,
    //但是requestLayout 会重新执行onLayout方法
    requestLayout();

}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值