SwitchButtom 一个以图片为背景的开关案例
2017-12-30 09:30
162 查看
/**
* SwitchButtom
* 点击和滑动,进行开关的控制
* 1.将两张图片初始化
* 2.绘制到View上面
* 3.处理事件
*/
public class SwitchButtom extends View {
private Bitmap background;
private Bitmap slide;
private boolean state;//开关的状态
private OnStateChangeListener onStateChangeListener;//监听对象
//new的时候调用
public SwitchButtom(Context context) {
this(context, null);
}
//使用style的使用调用
public SwitchButtom(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
//写在布局文件里面的时候调用
public SwitchButtom(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//初始化两张图片
//将资源 文件转成Bitmap对象
// getResources() 包含图片资源的资源对象
// R.drawable.background 图片资源的id
background = BitmapFactory.decodeResource(getResources(), R.drawable.background);
slide = BitmapFactory.decodeResource(getResources(), R.drawable.slide);
}
//将图片绘制到控件上面
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制
//参数1.图片对象
//参数2.x轴的开始位置
//参数3.y轴的开始位置
//参数4.画笔
canvas.drawBitmap(background, 0, 0, null);//背景
int left = 0;
if (isTouch) {
//滑块和手指一起移动
// left = currentX;//修正位置
left = currentX - slide.getWidth() / 2;
//处理边界问题
if (left < 0) {
left = 0;
}
if (left > background.getWidth() - slide.getWidth()) {
left = background.getWidth() - slide.getWidth();
}
canvas.drawBitmap(slide, left, 0, null);//滑块儿
} else {
//根据开关的状态绘制滑块
if (state) {
// getWidth()---背景的宽度
left = background.getWidth() - slide.getWidth();
} else {
left = 0;
}
canvas.drawBitmap(slide, left, 0, null);//滑块儿
}
}
//将控件的尺寸重新设置一下
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//根据背景图设置控件的宽高
setMeasuredDimension(background.getWidth(), background.getHeight());//将需要的宽高设置进去
}
//给外部提供一个设置开关的方法
public void setState(boolean state) {
this.state = state;
}
public boolean getState(){
return state;
};
//处理事件
private int currentX;
private boolean isTouch;//判断是否在触摸状态
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isTouch = true;
currentX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
currentX = (int) event.getX();
break;
case MotionEvent.ACTION_UP:
isTouch = false;
currentX = (int) event.getX();
//当手指抬起的时候,应该判断一下滑块儿的位置,然后设置开关的状态
// currentX 在中间位置的那边
int centerX = background.getWidth()/2;
if (currentX>centerX){
state = true;
}else {
state = false;
}
//调用接口里的方法
onStateChangeListener.onStateChange(state);
break;
}
//重新绘制
invalidate();
return true;
}
//接口回调
public interface OnStateChangeListener{
void onStateChange(boolean state);
}
//提供一个外部访问的方法
public void setOnStateChange(OnStateChangeListener onStateChangeListener){
this.onStateChangeListener = onStateChangeListener;
}
}
//Main
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SwitchButtom myButtom = (SwitchButtom) findViewById(R.id.mybutton);
//在外部设置监听
myButtom.setOnStateChange(new SwitchButtom.OnStateChangeListener() {
@Override
public void onStateChange(boolean state) {
Toast.makeText(MainActivity.this,"当前状态---"+state,Toast.LENGTH_SHORT).show();
}
});
}
}
//main布局还是用LinearLayout
<com.gjl.day04_switchbuttom.views.SwitchButtom
android:id="@+id/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
* SwitchButtom
* 点击和滑动,进行开关的控制
* 1.将两张图片初始化
* 2.绘制到View上面
* 3.处理事件
*/
public class SwitchButtom extends View {
private Bitmap background;
private Bitmap slide;
private boolean state;//开关的状态
private OnStateChangeListener onStateChangeListener;//监听对象
//new的时候调用
public SwitchButtom(Context context) {
this(context, null);
}
//使用style的使用调用
public SwitchButtom(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
//写在布局文件里面的时候调用
public SwitchButtom(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//初始化两张图片
//将资源 文件转成Bitmap对象
// getResources() 包含图片资源的资源对象
// R.drawable.background 图片资源的id
background = BitmapFactory.decodeResource(getResources(), R.drawable.background);
slide = BitmapFactory.decodeResource(getResources(), R.drawable.slide);
}
//将图片绘制到控件上面
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制
//参数1.图片对象
//参数2.x轴的开始位置
//参数3.y轴的开始位置
//参数4.画笔
canvas.drawBitmap(background, 0, 0, null);//背景
int left = 0;
if (isTouch) {
//滑块和手指一起移动
// left = currentX;//修正位置
left = currentX - slide.getWidth() / 2;
//处理边界问题
if (left < 0) {
left = 0;
}
if (left > background.getWidth() - slide.getWidth()) {
left = background.getWidth() - slide.getWidth();
}
canvas.drawBitmap(slide, left, 0, null);//滑块儿
} else {
//根据开关的状态绘制滑块
if (state) {
// getWidth()---背景的宽度
left = background.getWidth() - slide.getWidth();
} else {
left = 0;
}
canvas.drawBitmap(slide, left, 0, null);//滑块儿
}
}
//将控件的尺寸重新设置一下
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//根据背景图设置控件的宽高
setMeasuredDimension(background.getWidth(), background.getHeight());//将需要的宽高设置进去
}
//给外部提供一个设置开关的方法
public void setState(boolean state) {
this.state = state;
}
public boolean getState(){
return state;
};
//处理事件
private int currentX;
private boolean isTouch;//判断是否在触摸状态
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isTouch = true;
currentX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
currentX = (int) event.getX();
break;
case MotionEvent.ACTION_UP:
isTouch = false;
currentX = (int) event.getX();
//当手指抬起的时候,应该判断一下滑块儿的位置,然后设置开关的状态
// currentX 在中间位置的那边
int centerX = background.getWidth()/2;
if (currentX>centerX){
state = true;
}else {
state = false;
}
//调用接口里的方法
onStateChangeListener.onStateChange(state);
break;
}
//重新绘制
invalidate();
return true;
}
//接口回调
public interface OnStateChangeListener{
void onStateChange(boolean state);
}
//提供一个外部访问的方法
public void setOnStateChange(OnStateChangeListener onStateChangeListener){
this.onStateChangeListener = onStateChangeListener;
}
}
//Main
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SwitchButtom myButtom = (SwitchButtom) findViewById(R.id.mybutton);
//在外部设置监听
myButtom.setOnStateChange(new SwitchButtom.OnStateChangeListener() {
@Override
public void onStateChange(boolean state) {
Toast.makeText(MainActivity.this,"当前状态---"+state,Toast.LENGTH_SHORT).show();
}
});
}
}
//main布局还是用LinearLayout
<com.gjl.day04_switchbuttom.views.SwitchButtom
android:id="@+id/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
相关文章推荐
- 如何实现在一个界面上点击不同的位置,会有跳转到不同的Activity上(假设背景是一个图片)
- css3实现一个div设置多张背景图片及background-image属性
- 一个案例 用异步的方式获取内容和图片
- 一个解决chrome浏览器下input标签当autocomplete的时候背景变黄色同时input背景图片消失方案
- qt4:给你的窗口设置一个背景图片
- ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例
- 自定义TabHost 一个avtiviy 多个标签 ,实现背景图片随选项卡切换滑动效果
- 如何给屏幕设置一个充满全屏幕的背景图片
- 一个可设置背景图片的验证码图片的生成方法
- 在编写网站的时候,给一个div设置背景图片,怎么让这个图片随着div大小的改变,而等比例的缩放。
- 用css来写一个背景图片的切换
- ios:点击一个button不断切换背景图片
- CocoStudio 0.2.4.0 UI编辑器下根Panel控件设置背景图片时一个BUG
- css3实现一个div设置多张背景图片及background-image属性
- 鼠标悬停在表格任意一个<td>上改变整行背景颜色并在第一个td显示象征性的某图片
- 分享一个自己利用javascript中的window.setInterval()定时器实现页面背景图片淡入淡出效果
- 以一个图片为背景图,并且这上面画坐标的实现方式
- 如何载入一个图片,并将其作为Stage背景
- java 如何为一个窗体设置背景图片
- 使用HashMap做一个缓存案例【缓存一张图片】