android滑动开关框架,Android之实现滑动开关组件

由于Android并未提供滑动开关之类的组件,所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果。

这里有一个示例代码,它包括三个类:开关组件视图、状态监听接口、MainActivity

我们先来看看整个demo的效果图:

e2fae40d879e668235646f4165f99254.png

我们先来看看视图组件的完整代码,代码都已经注释:

package com.bear.swtichbuttondemo;

import java.util.ArrayList;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.Rect;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

/**

* 自定义滑动开关

*/

public class MySwitchButton extends View implements OnTouchListener {

private Bitmap switchOnBkg; // 开关开启时的背景

private Bitmap switchOffBkg; // 开关关闭时的背景

private Bitmap slipSwitchButton; // 滑动开关的图片

private boolean isSlipping = false; // 是否正在滑动

private boolean isSwitchOn = false; // 当前开关的状态,true表示开启,flase表示关闭

private float previousX; // 手指按下时的水平坐标x

private float currentX; // 当前的水平坐标X

private ArrayList onSwitchListenerList; // 开关监听器列表

public MySwitchButton(Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

private void init() {

this.setOnTouchListener(this); // 设置触摸监听器

onSwitchListenerList = new ArrayList();

}

public void setImageResource(int switchBkg, int slipBtn) {

switchOnBkg = BitmapFactory.decodeResource(this.getResources(),

switchBkg);

switchOffBkg = BitmapFactory.decodeResource(this.getResources(),

switchBkg);

slipSwitchButton = BitmapFactory.decodeResource(this.getResources(),

slipBtn);

}

public void setSwitchState(boolean switchState) {

this.isSwitchOn = switchState;

this.invalidate();

}

public boolean getSwitchState() {

return this.isSwitchOn;

}

public void setOnSwitchStateListener(OnSwitchListener listener){

onSwitchListenerList.add(listener);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Matrix matrix = new Matrix();

Paint paint = new Paint();

float leftSlipBtnX; // 滑动按钮的左边坐标

//画开关的背景图片

canvas.drawBitmap(switchOnBkg, matrix, paint);

if (isSlipping) {

// 如果正在滑动

if (currentX > switchOnBkg.getWidth()) {

leftSlipBtnX = switchOnBkg.getWidth()

- slipSwitchButton.getWidth();

} else {

leftSlipBtnX = currentX - slipSwitchButton.getWidth();

}

} else {

//如果没有滑动

if (isSwitchOn) {

leftSlipBtnX = switchOnBkg.getWidth()

- slipSwitchButton.getWidth();

} else {

leftSlipBtnX = 0;

}

}

//如果手指滑出了开关的范围,应当这样处理

if (leftSlipBtnX < 0) {

leftSlipBtnX = 0;

} else if (leftSlipBtnX > switchOnBkg.getWidth()

- slipSwitchButton.getWidth()) {

leftSlipBtnX = switchOnBkg.getWidth() - slipSwitchButton.getWidth();

}

//在画布上画开关图片

canvas.drawBitmap(slipSwitchButton, leftSlipBtnX, 0, paint);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

setMeasuredDimension(switchOnBkg.getWidth(), switchOnBkg.getHeight());

}

@Override

public boolean onTouch(View v, MotionEvent event) {

//获取触摸动作类型

int action = event.getAction();

switch (action) {

case MotionEvent.ACTION_MOVE:

//如果现在处于手指一动状态

currentX = event.getX();

break;

case MotionEvent.ACTION_DOWN:

//如果现在手指刚刚按上屏幕状态

isSlipping = true;

break;

case MotionEvent.ACTION_UP:

//如果现在手指刚刚离开屏幕状态

isSlipping = false;

boolean previousState = isSwitchOn;

if (event.getX() > (switchOnBkg.getWidth() / 2)) {

isSwitchOn = true;

} else {

isSwitchOn = false;

}

//调用接口回调方法,将开关状态通知给监听对象

if(previousState != isSwitchOn){

if(onSwitchListenerList.size() > 0){

for(OnSwitchListener listener : onSwitchListenerList){

listener.onSwitched(isSwitchOn);

}

}

}

break;

default:

break;

}

this.invalidate();

return true;

}

}

我们再来看看开关状态监听接口代码,如下:

package com.bear.swtichbuttondemo;

public interface OnSwitchListener {

public abstract void onSwitched(boolean isSwitchOn);

}

最后是我们的Activity中的代码,这里需要传两张图片给自定义组件,当然你也可以传两张自己做好的图片,代码如下:

package com.bear.swtichbuttondemo;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends Activity {

private MySwitchButton mySwitchButton;

private Button myBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

setupViews();

}

private void setupViews() {

mySwitchButton = (MySwitchButton) findViewById(R.id.my_switch_button);

//传图片给自定义组件

mySwitchButton.setImageResource(R.drawable.switch_bkg_switch,

R.drawable.switch_btn_slip);

myBtn = (Button) findViewById(R.id.button);

//设置开关状态监听

mySwitchButton.setOnSwitchStateListener(new OnSwitchListener() {

@Override

public void onSwitched(boolean isSwitchOn) {

if (isSwitchOn) {

Toast.makeText(MainActivity.this, "开关开启",

Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(MainActivity.this, "开关关闭",

Toast.LENGTH_SHORT).show();

}

}

});

myBtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

boolean isOn = mySwitchButton.getSwitchState();

mySwitchButton.setSwitchState(!isOn);

}

});

}

}

最后附上Android之实现滑动开关组件代码的下载地址:

------------------------------------------分割线------------------------------------------

具体下载目录在 /2014年资料/12月/15日/Android之实现滑动开关组件

------------------------------------------分割线------------------------------------------

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机操作系统(3):操作系统的基本特征

1.3 操作系统的基本特征 1.3.1 并发&#xff08;Concurrence&#xff09; 并行与并发&#xff1a; 并行性——两个或多个事件在同一时刻发生 并发性——两个或多个事件在同一时间间隔内发生 在多道程序环境下&#xff0c;并发性是指在一段时间内&#xff0c;宏观上有多…

最简单的docker教程:在docker里运行nginx服务器

命令行docker search nginx搜索名为nginx的docker image&#xff0c;返回结果的第一个&#xff0c;github上有10293个star&#xff0c;这就是我们想要搜索的结果&#xff1a; 使用命令docker pull把这个镜像拖下来&#xff1a; docker pull nginx 然后以detach模式运行这个镜像…

okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程

1.简单使用同步&#xff1a;Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed true;}try {client.dispatcher().executed(this);Response result getRe…

H5实现轮播

页面代码&#xff1a; <div id"body_wrapper" class"container"><article><section id"lunbotu"><div class"wrap"><div id"slide-holder"><div id"slide-runner"><a hre…

计算机操作系统(4):操作系统的重要功能

1.4 操作系统的主要功能 处理机管理功能 存储器管理功能 设备管理功能 文件管理功能 用户接口 1处理机管理功能 也可称为进程管理在传统的多道程序设计系统中&#xff0c;处理机的分配和运行&#xff0c;都是以进为基本单位的&#xff0c;因而对处理机的管理&#xff0…

html5本地存储论坛,Web Storage--HTML5本地存储

什么是Web StorageWeb Storage是HTML5里面引入的一个类似于cookie的本地存储功能&#xff0c;可以用于客户端的本地存储&#xff0c;其相对于cookie来说有以下几点优势&#xff1a;存储空间大&#xff1a;cookie只有4KB的存储空间&#xff0c;而Web Storage在官方建议中为每个网…

计算机操作系统(5):操作系统的结构设计

1.5 操作系统的结构设计 OS的结构经历了四代变革&#xff1a; 微内核OS结构——现代OS结构 微内核结构能有效地支持多处理机运行&#xff0c;故非常使用于分布式系统环境。 Windows NT采用微内核结构 在与微内核技术发展的同时&#xff0c;客户/服务器技术、面向对象技术…

Linux软链接和硬链接

Linux软链接和硬链接 1. 软链接link 定义&#xff1a;就是windows系统的快捷方式 作用&#xff1a;可以对硬盘空间进行合理分配 具体设置&#xff1a; ln -s 源文件 软链接 1.1 软链接使用注意 ① 设置软链接&#xff0c;如果软链接和源文件不在同一级目录&#xff0c;原…

项目管理(3):备战pmp

1组织结构与项目管理 2职能型组织的优缺点 优点 简单对专家更易于管理&#xff0c;管理更具灵活性只向一个上司汇报项目人员有“家”——他们在部门里工作&#xff0c;部门给予相应的技术支持员工可以不断得到提高缺点 项目经理没有足够的权力没有明确的责任人客户可能找不到专…

【leetcode】16 3Sum Closest

描述 给定一个数字集合 S 以及一个数字 target&#xff0c;需要从集合中找出3个数字的和与这个 target的值最接近&#xff08;绝对值最小&#xff09; 样例 Input: S [-1, 2, 1, -4], target 1Output: 2 思路 首先排序&#xff0c;之后确定一个数字的前提下&#xff0c;再利用…

项目管理(4):备战pmp

1单个项目管理过程 如何实现项目管理&#xff1f; 通过“过程”processes实现 大多数情况下&#xff0c;大多数项目都有共同的项目管理过程 项目管理知识提供的是good practice 应用这些过程能大大提高项目成功的机会 项目经理与项目团队的责任 确定哪些过程适用于具体给…

项目管理(6):备战pmp

项目整体管理 定义&#xff1a; 识别、定义、结合、统一与协调项目管理过程组中的各个过程以及项目管理活动 在各个相互冲突的目标与方案之间权衡取舍 在项目管理中发挥明显的重要作用 Eg&#xff1a;应急计划的成本估算成本管理时间管理风险管理 基本任务&#xff1a; …

项目管理(7):备战pmp

1.2制定项目初步范围说明书 项目范围说明书&#xff08;初步&#xff09; 目的&#xff1a; 登记项目及其产品和服务的特征与边界&#xff0c;以及验收与范围控制的方法 内容&#xff1a; 项目与产品的目标 产品或服务的要求与特性 产品验收标准 项目边界 项目要求与可…

旅馆客未满 计算机术语,前厅测试题

《前厅服务》单元测试一一、单项选择题(每题1分&#xff0c;共50分)1、按照人类生产、生活、社会实践活动领域的不同&#xff0c;道德可划分为三个组成部分&#xff0c;其中不包括()。A、职业道德B、家庭美德C、社会良知D、社会公德2、职业道德是人们在长期的职业活动中形成的(…

计算机操作系统(7):进程的基本概念

2.1 进程的基本概念 程序的顺序执行及其特征程序的并发执行及其特征进程的特征与状态进程控制块 2.1.1 程序的顺序执行及其特征 顺序执行包含两层含义&#xff1a; 在单道批处理系统中&#xff0c;对于多个用户程序来说&#xff0c;所有程序是依次执行的。(外部顺序性) 对…

无法打开计算机上的event log服务,Win7系统下启用Windows event log服务发生4201错误的正确解决方法...

Windows event log服务会把程序与系统发送的错误消息记录在日志中&#xff0c;其中还包含了部分有用的诊断信息&#xff0c;近期有Win7用户在启用windows event log服务的时候&#xff0c;发生4201错误提示框。那么该如何解决该问题&#xff1f;下面装机之家分享一下Win7系统下…

广义线性模型的计算机应用技术学院,SPSS数据分析—广义线性模型

我们前面介绍的一般线性模型、Logistic回归模型、对数线性模型、Poisson回归模型等&#xff0c;实际上均属于广义线性模型的范畴&#xff0c;广义线性模型包含的范围非常广泛&#xff0c;原因在于其对于因变量、因变量的概率分布等条件的限制放宽&#xff0c;使其应用范围加大。…

中国第一个计算机病毒什么时候,新中国成立以来的第一例电脑病毒小球病毒是在1988年发现...

扩展阅读&#xff1a;1988年&#xff0c;随着软件交流&#xff0c;石头和小球病毒跟随软盘悄悄地通过香港和美国进入了中国内地&#xff0c;并在人们的懵懂之间在大型企业和研究所间广为传播。小球病毒是国内发现的第一个计算机病毒。发作条件是当系统时钟处于半点或整点&#…

计算机操作系统(8):进程的控制

2.2 进程控制 进程控制是进程管理中最基本的功能。 进程控制包括&#xff1a; ◆ 创建进程 ◆ 终止进程 ◆ 进程状态转换 进程控制是由OS的内核完成的。 2.2.1 进程的创建 2&#xff0e;进程的创建 调用进程创建原语Create&#xff08;&#xff09;&#xff0c;按下述…

计算机操作系统(9):深入理解B/S与C/S架构

深入理解B/S与C/S架构 阅读目录 C/S架构简要介绍 什么是B/S架构 B/S架构的几种形式 发展前景 一、C/S架构简要介绍 在了解什么是B/S架构之前&#xff0c;我们有必要了解一下什么是C/S架构&#xff1a; C/S架构是第一种比较早的软件架构&#xff0c;主要用于局域网内。也叫…