自定义开关ToggleButton


package com.example.test;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
//------------MainActivity中----------------------
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控件
TooggleButtonCustom buttonCustom=(TooggleButtonCustom) findViewById(R.id.custom_button);
//设置背景图片
buttonCustom.setBackGroundPic(R.drawable.switch_background);
//设置前边的图片
buttonCustom.setForePic(R.drawable.slide_button_background);
//设置默认状态
buttonCustom.setState(false);
}
}
//-------------自定义控件TooggleButtonCustom------继承view--------------------
package com.example.test;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class TooggleButtonCustom extends View{
private Bitmap backBitmap;//背景图片
private Bitmap foreBitmap;//上面的图片
private boolean state=false;
private int currentX;//获得位置
boolean isTouching;//是否是触摸
//有style资源文件时使用
public TooggleButtonCustom(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
// xml布局文件中使用
public TooggleButtonCustom(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
//java代码中创建时使用这个构造方法
public TooggleButtonCustom(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
//设置背景图片
public void setBackGroundPic(int switchBackground) {
backBitmap = BitmapFactory.decodeResource(getResources(),switchBackground);
}
//设置前边图片
public void setForePic(int slideButtonBackground) {
foreBitmap = BitmapFactory.decodeResource(getResources(),slideButtonBackground);
}
//设置开关状态
public void setState(boolean b) {
this.state=b;
}
/**
* 测量控件的宽高
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(backBitmap.getWidth(), backBitmap.getHeight());
}
/**
* 绘制控件
*/
@Override
protected void onDraw(Canvas canvas) {
// 1.平铺背景图片
canvas.drawBitmap(backBitmap, 0, 0, null);
if (isTouching) {
int left = currentX - foreBitmap.getWidth()/2;
//两个问题 ,位置不在中心,,移出范围
if (left < 0) {
left = 0;
}else if (left > backBitmap.getWidth() - foreBitmap.getWidth()) {
left = backBitmap.getWidth() - foreBitmap.getWidth();
}
canvas.drawBitmap(foreBitmap, left, 0, null);
}else {
// 2.根据状态去绘制 上面图片
if (state) {
// 右边
canvas.drawBitmap(foreBitmap,
backBitmap.getWidth() - foreBitmap.getWidth(), 0, null);
} else {
// 左边
canvas.drawBitmap(foreBitmap, 0, 0, null);
}
}
}
/**
* 触摸控件时调用的方法
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isTouching = true;
currentX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
isTouching = true;
currentX = (int) event.getX();
break;
case MotionEvent.ACTION_UP:
isTouching = false;
currentX = (int) event.getX();
state = currentX > backBitmap.getWidth()/2;
break;
default:
break;
}
invalidate();//重复绘制控件 自动调用OnDraw()
return true;// 自己处理触摸事件
}
}
//------------------------主布局文件---------------------------
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.example.test.TooggleButtonCustom
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:id="@+id/custom_button"></com.example.test.TooggleButtonCustom>
</RelativeLayout>
自定义开关ToggleButton的更多相关文章
- 自定义开关ToggleButton的使用
[代码]: toggleMe.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override p ...
- 使用Scroller制作滑块开关ToggleButton
Scroller这个类在自己定义view中使用的还算是非常频繁的,和它名字一样.我们通常是在控制滑动的时候使用Scroller,以便让view滑动起来不那么生硬.在官方的解释上,Scroller是一个 ...
- android开关控件Switch和ToggleButton
序:今天项目中用到了开关按钮控件,查阅了一些资料特地写了这篇博客记录下. 1.Switch <Switch android:id="@+id/bt" android:layo ...
- Ext 6.5.3 classic版本,自定义实现togglefield开关控件
1,在Ext 6.5.3的classic版中没有提供开关控件,参照modern版中 togglefield开关的实现,继承滑动器(sliderfield),自定义一个开关按钮.支持value绑定和点击 ...
- Android自定义控件7--自定义开关--绘制界面内容
本文实现全自定义控件--自定义开关 本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,转载请注明源地址. 自定义开关 (View),本文完成下面内 ...
- 6.Android之switch和togglebutton按钮学习
Switch和ToggleButton按钮在手机上也经常看到,比如手机设置里面wlan,蓝牙,gps开关等. 首先在工具上拖进一个switch和togglebutton开关按钮,如图 生成xml代码如 ...
- 自定义控件(模仿微信ToggleButton控件)
弄过android开发的都知道,系统有一个默认的ToggleButton,但很多人都觉得他很难看,当然也包括我.如果你感觉他不难看,那你就继续使用系统的吧,这篇文章对你来说是多余的了. 今天来写一个模 ...
- Android自定义控件(一)——开关控件
Google 在 API 14 开始才新增了Switch 控件. 因此,我们可以选择自己封装一个Switch . 效果如图: View主要代码: public class SwitchView ext ...
- 1.2UISwitch 1.3 自定义UIswitch 1.4pickerView
1.2 UISwitch创建和使用开关 问题你想给你的用户打开一个选项或关闭的能力.解使用UISwitch类. 讨论该UISwitch类提供像在图1-7为自动大写,自动校正,等等所示的开/ ...
随机推荐
- C# 语言规范_版本5.0 (第1章 介绍)
1. 介绍 C#(读作“See Sharp”)是一种简洁.现代.面向对象且类型安全的编程语言.C# 起源于 C 语言家族,因此,对于 C.C++ 和 Java 程序员,可以很快熟悉这种新的语言.C# ...
- 洛谷-陶陶摘苹果(升级版)-BOSS战-入门综合练习1
题目描述 Description 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同 ...
- Spring测试
测试类添加两个注解 @RunWith(SpringJUnit4ClassRunner.class)和@ContextConfiguration(locations = "classpath: ...
- python--zeros函数和ones函数
使用numpy.zeros,numpy.ones,numpy.eye等方法可以构造特定的矩阵 例如: 代码如下: >>>from numpy import * >>> ...
- 行列转换之静态、动态、PIVOT方法
/* 标题:普通行列转换(version 2.0) 作者:爱新觉罗.毓华 时间:2008-03-09 地点:广东深圳 说明:普通行列转换(version 1.0)仅针对sql server 2000 ...
- tableview 详解I
在开发iphone的应用时基本上都要用到UITableView,这里讲解一下UITableView的使用方法及代理的调用情况 UITableView使用详解 - (void)viewDidLoad { ...
- php 好用的函数
extract — 从数组中将变量导入到当前的符号表,数组的键将作为新的变量,数组的值将最为新变量的值
- 工作中用到的简单linux命令
1.rpm包查询.卸载.安装: rpm包查询 rpm -q 包名(不带版本号.后缀等) q----query rpm包卸载 rpm -e 包名(不带版本号.后缀等)e----erase rpm包安装 ...
- UVALive - 3026 Period kmp next数组的应用
input n 2<=n<=1000000 长度为n的字符串,只含小写字母 output Test case #cas 长度为i时的最小循环串 循环次数(>1) 若没有则不输出 做法 ...
- 线程池Executors探究
线程池用到的类在java.util.concurrent包下,核心类是Executors,通过其不同的几个方法可产生不同的线程池. 1.生成固定大小的线程池 public static Executo ...