• Android自定义控件7--自定义开关--绘制界面内容


    本文实现全自定义控件--自定义开关

    本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,转载请注明源地址。

    自定义开关 (View),本文完成下面内容

    1. 写个类继承View
    2. 拷贝包含包名的全路径到xml中
    3. 界面中找到该控件, 设置初始信息
    4. 根据需求绘制界面内容

    Android 的界面绘制流程: 
     测量----------> 摆放 -------->绘制
     measure ----->layout ---->draw
        |                      |                 |
     onMeasure--->OnLayout-->onDraw

    新建类ToggleView,继承自View

    package com.wuyudong.toggleview.ui;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    
    /**
     * 自定义开关
     * 
     * @author wuyudong
     * 
     */
    public class ToggleView extends View {
    
        /**
         * 用于代码创建控件
         * 
         * @param context
         */
        public ToggleView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }
    
        /**
         * 用于在xml里使用,可指定自定义属性
         * 
         * @param context
         * @param attrs
         */
        public ToggleView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
        }
    
        /**
         * 用于在xml里使用,可指定自定义属性,如果指定了样式,则走此构造函数
         * 
         * @param context
         * @param attrs
         * @param defStyle
         */
        public ToggleView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
        }
    
        /**
         * 设置背景图
         * 
         * @param switchBackground
         */
        public void setSwitchBackgroundResource(int switchBackground) {
    
        }
    
        /**
         * 设置滑块图片资源
         * 
         * @param slideButton
         */
        public void setSlideButtonResource(int slideButton) {
    
        }
    
        /**
         * 设置开关状态
         * 
         * @param b
         */
        public void setSwitchState(boolean b) {
    
        }
    
    }

    布局如下:

    <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.wuyudong.toggleview.ui.ToggleView
            android:id="@+id/toggleView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true" />
    
    </RelativeLayout>

    接着将画布进行填充,设置开关状态

    package com.wuyudong.toggleview.ui;
    
    
    import com.wuyudong.toggleview.R;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;
    
    /**
     * 自定义开关
     * 
     * @author wuyudong
     * 
     */
    public class ToggleView extends View {
    
        private Bitmap switchBackgroundBitmap;
        private Bitmap slideButtonBitmap;
        private boolean mSwitchState = false; //开关状态,默认关闭
    
        /**
         * 用于代码创建控件
         * 
         * @param context
         */
        public ToggleView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }
    
        /**
         * 用于在xml里使用,可指定自定义属性
         * 
         * @param context
         * @param attrs
         */
        public ToggleView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
        }
    
        /**
         * 用于在xml里使用,可指定自定义属性,如果指定了样式,则走此构造函数
         * 
         * @param context
         * @param attrs
         * @param defStyle
         */
        public ToggleView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(switchBackgroundBitmap.getWidth(),
                    switchBackgroundBitmap.getHeight());
        }
    
        
        /** 
         * Canvas: 画布,画板,在上面绘制的内容都会显示在界面上
         */
        @Override
        protected void onDraw(Canvas canvas) {//1、绘制背景
            Paint paint = new Paint();
            canvas.drawBitmap(switchBackgroundBitmap, 0, 0, paint);
            //2、绘制滑块
            //根据开关状态,直接设置图片位置
            if(mSwitchState) {
                int newLeft = switchBackgroundBitmap.getWidth() - slideButtonBitmap.getWidth();
                canvas.drawBitmap(slideButtonBitmap, newLeft, 0, paint);
            } else {
                canvas.drawBitmap(slideButtonBitmap, 0, 0, paint);
            }
            
        }
    
        /**
         * 设置背景图
         * 
         * @param switchBackground
         */
        public void setSwitchBackgroundResource(int switchBackground) {
            switchBackgroundBitmap = BitmapFactory.decodeResource(getResources(),
                    switchBackground);
    
        }
    
        /**
         * 设置滑块图片资源
         * 
         * @param slideButton
         */
        public void setSlideButtonResource(int slideButton) {
            slideButtonBitmap = BitmapFactory.decodeResource(getResources(),
                    slideButton);
    
        }
    
        /**
         * 设置开关状态
         * 
         * @param b
         */
        public void setSwitchState(boolean mSwitchState) {
            this.mSwitchState = mSwitchState;
            
        }
    
    }
  • 相关阅读:
    了解运行时类型信息(RTTI)
    linux培训笔记1
    Delphi 的各种错误信息(中英文)
    delphi XML 原来可以玩接口
    wxWidgets初学者导引(2)——下载、安装wxWidgets
    Delphi中ADO异步执行方式
    模态运行EXE程序
    window.setTimeout()函数的使用
    应用程序的关闭退出(在FMX中,Activity替代了Form的概念)
    Dll方式的线程,需要引用这个
  • 原文地址:https://www.cnblogs.com/wuyudong/p/5922316.html
Copyright © 2020-2023  润新知