准备两张图片,按钮背景,上面的小开关

创建一个类MyToggleBtn,继承View

实现三个构造方法,传递上下文,

实现构造方法,传递Context对象,在java代码中实例化时主要使用这个

实现构造方法,传递Context对象,AttributeSet对象,在布局文件中主要使用

View对象显示在屏幕上,有几个重要步骤

1.构造方法创建对象

2.测量view的大小 onSeasure(int,int)

3.确定view的位置,view自身有一些建议权,决定权在父view手中 onLayout()

4.绘制view的内容 onDraw(Canvas)

构造方法,初始化view,

调用BitmapFactory.decodeResurce()方法,把图片资源转成Bitmap对象,参数:Resource对象(getResources()),资源id

重写onMesaure()方法,

不要调用父类

调用setMeasuredDimension()方法,参数:宽度,高度;调用背景Bitmap对象的getWidth()和getHeight()

重写onDraw()方法,传递进来Canvas对象

调用Canvas对象的drawBitmap()方法,参数:Bitmap对象,左边点(0),上边点(0),Paint对象

获取Paint对象,new出来

调用Paint对象的setAntiAlias(),设置抗锯齿,参数:布尔值

滑动按钮

滑动按钮目前的位置,0,0,状态是 关

canvas.drawBitmap(bitmapBtn, 0, 0, paint);

滑动按钮的位置在,背景图的宽度-滑动按钮的宽度,0,状态是 开

canvas.drawBitmap(bitmapBtn, 背景图的宽度-滑动按钮的宽度, 0, paint);

定义成员变量currentState存储当前状态,值:布尔值

调用setOnClickListener()方法,设置点击事件,参数:this

当前类实现obClickListener接口,实现onClick()方法

切换当前状态currentState=!currentState

判断当前状态

如果为真,滑动按钮的左边是背景图的宽度-滑动按钮的宽度

如果为假,滑动按钮的左边是0

调用invalidate()方法,刷新当前视图

MyToggleBtn.java

package com.tsh.myswitchbtn;

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;
import android.view.View.OnClickListener; public class MyToggleBtn extends View implements OnClickListener {
//背景图片
private Bitmap bitmapBackground;
//按钮图片
private Bitmap bitmapBtn;
private Paint paint;
/**
* 布局文件中使用
* @param context
* @param attrs
*/
public MyToggleBtn(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
/**
* 初始化view
*/
private void initView() {
bitmapBackground=BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
bitmapBtn=BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);
paint=new Paint();
paint.setAntiAlias(true);
//点击事件
setOnClickListener(this);
}
/**
* 计算大小
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(bitmapBackground.getWidth(), bitmapBackground.getHeight());
}
//当前状态
private boolean currentState=false;
//滑动按钮的当前left
private float slideBtnLeft=0;
/**
* 绘制view
*/
@Override
protected void onDraw(Canvas canvas) {
//绘制背景
canvas.drawBitmap(bitmapBackground, 0, 0, paint);
//绘制滑动按钮
canvas.drawBitmap(bitmapBtn, slideBtnLeft, 0, paint);
}
/**
* 点击事件
*/
@Override
public void onClick(View v) {
currentState=!currentState;
if(currentState==true){
slideBtnLeft=bitmapBackground.getWidth()-bitmapBtn.getWidth();
}else{
slideBtnLeft=0;
}
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="${relativePackage}.${activityClass}" > <com.tsh.myswitchbtn.MyToggleBtn
android:layout_centerInParent="true"
android:id="@+id/my_toggle_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> </RelativeLayout>

[android] 切换按钮-自定义控件的更多相关文章

  1. [android] 切换按钮-自定义控件-拖动效果

    重写View的onTouchEvent()方法,传递进来MotionEvent对象 调用MotionEvent对象的getAction()方法,获取当前动作 switch判断一下当前动作 事件为Mot ...

  2. Android开发技巧——自定义控件之使用style

    Android开发技巧--自定义控件之使用style 回顾 在上一篇<Android开发技巧--自定义控件之自定义属性>中,我讲到了如何定义属性以及在自定义控件中获取这些属性的值,也提到了 ...

  3. [Android Studio] 按钮学习

    Android Studio 按钮 1. 添加一个按钮 新建一个 Blank Project 之后, 在 activity_main.xml: 中添加一个按钮, 可以使用design 模式来添加,: ...

  4. 荐 android 如何打包自定义控件(转)

    荐 android 如何打包自定义控件(转)   目录[-] 方式一:将项目打包成jar包 方式二:项目作为一个library 设计自定义的控件对android开发人员来说,是家常便饭了,但是多次做项 ...

  5. Android开发技巧——自定义控件之增加状态

    Android开发技巧--自定义控件之增加状态 题外话 这篇本该是上周四或上周五写的,无奈太久没写博客,前几段把我的兴头都用完了,就一拖再拖,直到今天.不想把这篇拖到下个月,所以还是先硬着头皮写了. ...

  6. Android开发技巧——自定义控件之自定义属性

    Android开发技巧--自定义控件之自定义属性 掌握自定义控件是很重要的,因为通过自定义控件,能够:解决UI问题,优化布局性能,简化布局代码. 上一篇讲了如何通过xml把几个控件组织起来,并继承某个 ...

  7. Android开发技巧——自定义控件之组合控件

    Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...

  8. C# PDF Page操作——设置页面切换按钮

    概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者最后一页,另一种是设置按钮跳转到指定页面.两种方法适 ...

  9. 纯css实现checkbox开关切换按钮

    我们都知道 checkbox 标签默认样式 实在是太low了,故对CheckBox美化很有必要. 现提供两种方式对其进行美化. 方法一 <div class="switch-wrap ...

随机推荐

  1. Html Agility Pack解析Html(C#爬虫利器)

    有个需求要写网络爬虫,以前接触过一个叫Html Agility Pack这个解析html的库,这次又要用到,然而发现以前咋用的已经不记得了,现在从头开始记录一下使用过程. Html Agility P ...

  2. 定位 和 z-index

    三.定位 定位有三种:(1) 相对定位.(2) 绝对定位.(3) 固定定位 1.相对定位(相对于自己原来的位置定位) 现象和使用: a.如果对当前元素仅仅设置了相对定位,那么与标准流的盒子没什么区别: ...

  3. canvas制作完美适配分享海报

    基于mpvue实现的1080*1900小程序海报 html   <canvas class="canvas" :style="'width:'+windowWidt ...

  4. git关联githup和码云

    1.与已有的本地仓库关联git remote add origin git@github.com:michaelliao/learngit.git然后就可以协作开发push与pull 2.第二种方法直 ...

  5. (转)Java并发编程:线程池的使用方法

    http://www.cnblogs.com/dolphin0520/p/3932921.html http://www.journaldev.com/1069/java-thread-pool-ex ...

  6. oracle 用户权限相关

    --查看数据库下的所有用户: select username from dba_users; --查看当前连接数据库的用户角色 SELECT * FROM USER_ROLE_PRIVS; -- 创建 ...

  7. Django设置联合唯一约束 -- migrate时报错处理

    异常信息: a unique database constraint for 2 or more fields together 场景描述: 对于ORM中多对多关系的中间表,如果该关系表是手动创建的, ...

  8. docker学习实践之路[第二站]nginx镜像实践

    上一篇文章中已经成功的拉取的nginx的镜像 在本篇文章中则详细介绍docker利用文件卷.断后映射然后进行nginx的配置. 输入一下命令: docker run -d --name mynginx ...

  9. shell信号捕捉命令 trap

    trap 命令 tarp命令用于在接收到指定信号后要执行的动作,通常用途是在shell脚本被中断时完成清理工作.例如: 脚本在执行时按下CTRL+c时,将显示"program exit... ...

  10. (转)centos 7 Tomcat 8.5 的安装及生产环境的搭建调优

    原文:https://www.cnblogs.com/linhankbl/articles/9149804.html#top JVM菜鸟进阶高手之路七(tomcat调优以及tomcat7.8性能对比) ...