当前位置:首页 > Android > 正文内容

Android自定义控件之滑动开关解析

jsc9年前 (2016-04-07)Android3671

Android自定义控件之滑动开关解析。包括开关的绘制、开关滑动实现。android自定义控件、android滑动控件、android自定义开关。

效果如图:

01443356019108_!!4433.jpg

1、开关的绘制

首先在布局activity_main.xml中放置该开关,宽高选择包裹内容,实际的大小和图片我们将在java代码中指定

以下为引用内容:<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="cn.hugo.android.slidetoggle.MainActivity" >
    <!--必须需要把自定义的控件的包名和类名写完整-->
    <cn.hugo.android.slidetoggle.widget.SlideToggle
        android:id="@+id/toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" >
    </cn.hugo.android.slidetoggle.widget.SlideToggle>
</RelativeLayout>

然后,在activity中设置该布局文件MainActivity.java

以下为引用内容:package cn.hugo.android.slidetoggle;
import android.app.Activity;
import android.os.Bundle;
import cn.hugo.android.slidetoggle.widget.SlideToggle;
public class MainActivity extends Activity {
	private SlideToggle toggle;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		toggle = (SlideToggle) findViewById(R.id.toggle);
		
		toggle.setToggleState(true); //设置开关状态为打开
	}
}

最后定义一个继承view的滑动开关控件,SlideToggle.java

以下为引用内容:package cn.hugo.android.slidetoggle.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import cn.hugo.android.slidetoggle.R;
public class SlideToggle extends View {
	private Bitmap slideButton;
	private Bitmap switchButton;
	private boolean mState; // 开关状态
	public SlideToggle(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}
	public SlideToggle(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);

		slideButton = BitmapFactory.decodeResource(getResources(),
				R.drawable.slide_button_background);
		switchButton = BitmapFactory.decodeResource(getResources(),
				R.drawable.switch_background);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 把开关的背景画到画布上
		canvas.drawBitmap(switchButton, 0, 0, null);
		// 根据开关状态把可移动的背景描绘在画布上
		if (mState) {
			canvas.drawBitmap(slideButton, switchButton.getWidth()
					- slideButton.getWidth(), 0, null);
		}
		else {
			canvas.drawBitmap(slideButton, 0, 0, null);
		}
	}
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		// 设置控件的宽和高,为背景图片的宽高
		setMeasuredDimension(switchButton.getWidth(), switchButton.getHeight());
	}
	/**
	 * 设置开关状态
	 * @param b
	 * true:开;false:关
	 */
	public void setToggleState(boolean b) {
		this.mState = b;
	}
}

Canvas.drawBitmap(Bitmap bitmap,float left, float top,Paint paint) 方法,是在该控件中绘制图画,其中bitmap是需要绘制的图,left和top是把该图画在距离该控件左边、上边的距离的位置。现在,安装该应用后,显 示如前面的效果图。

2、实现滑动

我们此时需要覆盖View的public boolean onTouchEvent(MotionEvent event);方法,对手指的按下、移动、移开操作进行处理。有些细节需要进行特殊处理,比如滑块滑出控件,开关状态的处理等。

以下为引用内容:package cn.hugo.android.slidetoggle.widget;
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;
import cn.hugo.android.slidetoggle.R;
public class SlideToggle extends View {
	private Bitmap slideButton;
	private Bitmap switchButton;
	private boolean mState; // 开关状态
	private float mCurrentX; // 记录手指按下的位置
	private boolean isSliding; // 是否正在滑动
	public SlideToggle(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}
	public SlideToggle(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);

		slideButton = BitmapFactory.decodeResource(getResources(),
				R.drawable.slide_button_background);
		switchButton = BitmapFactory.decodeResource(getResources(),
				R.drawable.switch_background);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 把开关的背景画到画布上
		canvas.drawBitmap(switchButton, 0, 0, null);
		if (isSliding) { // 正在对开关进行滑动
			float left = mCurrentX - slideButton.getWidth() / 2; // 使滑块处于手指的中间位置
			// 避免滑块滑出控件范围
			if (left < 0) {
				left = 0;
			}
			else if (left > switchButton.getWidth() - slideButton.getWidth()) {
				left = switchButton.getWidth() - slideButton.getWidth();
			}
			canvas.drawBitmap(slideButton, left, 0, null);
		}
		else {
			// 根据开关状态把可移动的背景描绘在画布上
			if (mState) {
				canvas.drawBitmap(slideButton, switchButton.getWidth()
						- slideButton.getWidth(), 0, null);
			}
			else {
				canvas.drawBitmap(slideButton, 0, 0, null);
			}
		}
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {

		switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN: {
				mCurrentX = event.getX(); // 记录按下时相对控件的x轴位置,event.getRawX是相对整个屏幕的x位置
				isSliding = true;
				break;
			}
			case MotionEvent.ACTION_UP: {
				isSliding = false;
				// 判断当前状态属于何种状态,把开关设置为相应状态
				mState = mCurrentX > switchButton.getWidth() / 2; // 移开滑块的x位置大于开关背景一半,则视为打开状态
				break;
			}
			case MotionEvent.ACTION_MOVE: {
				mCurrentX = event.getX();
				break;
			}
			default:
				break;
		}
		invalidate(); // 使控件调用一次onDraw()方法
		return true; // 消耗触摸事件,事件不再传递
	}
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		// 设置控件的宽和高,为背景图片的宽高
		setMeasuredDimension(switchButton.getWidth(), switchButton.getHeight());
	}
	/**
	 * 设置开关状态
	 * @param b
	 * true:开;false:关
	 */
	public void setToggleState(boolean b) {
		this.mState = b;
	}
}


扫描二维码推送至手机访问。

版权声明:本文由微小站发布,如需转载请注明出处。

本文链接:https://www.jsc0.com/post/98.html

分享给朋友:

“Android自定义控件之滑动开关解析” 的相关文章

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google...

android json解析及简单例子

JSON的定义:       一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式...

ViewPager + HorizontalScrollView 实现可滚动的标签栏

ViewPager + HorizontalScrollView 实现可滚动的标签栏

这是一个可滑动的标签栏的自定义控件,参考此文章http://blog.csdn.net/fx_sky/article/details/8990573,我将主要的功能整合成一个类,配上2个特定的布局即可使用。 效果图:    主要布局文件:<?xml&nb...

onTextChanged参数解释及实现EditText字数监听

由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher。它有三个成员方法,第一个after很简单,这个方法就是在EditText内容已经改变之后调用,重点看下面两个方法:beforeTextChanged(CharSequ...

采用SharedPreferences保存用户偏好设置参数和读取设置参数

采用SharedPreferences保存用户偏好设置参数和读取设置参数

Android SDK支持那些文件存储技术? 1. 使用SharedPreferences保存key-value类型的数据 2. 流文件存储(使用openFileOutput和openFileInput方法,或FileInputStream和FileO...

Android开发之资源文件存储

在android开发中,资源文件是我们使用频率最高的,无论是string,drawable,还是layout,这些资源都是我们经常使用到的,而且为我们的开始提供很多方便,不过我们平时接触的资源目录一般都是下面这三个。        /res...