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;原…

编写HTML提高编写代码的效率,优化innerHTML操作(提高代码执行效率)

例子&#xff1a;我们要实现的效果是当用户点击鼠标的时候&#xff0c;就在旧数据上追加若干新数据。如果使用标准DOM的话&#xff0c;完整代码如下&#xff1a;testdatadocument.onmousedown function() {for (var i 0; i < 10; i) {var p document.createElement("…

计算机操作系统(6):练习题

1&#xff0e;计算机操作系统的功能是 d 。 A. 把源程序代码转换为目标代码 B. 实现计算机用户之间的相互交流 C. 完成计算机硬件与软件之间的转换 D. 控制、管理计算机系统的资源和程序的执行 2&#xff0e;____a__不是分时系统的特点。 A&#xff0e;多个用户是…

router锚点和html锚点,hash模式下Vue-router页面返回锚点(scroll behavior)实现

在普通页面中&#xff0c;点击浏览器的返回按钮&#xff0c;在返回到上一页时会处在上次浏览的位置。单页面应用中&#xff0c;由于始终是同一个页面&#xff0c; 因此需要自行实现页面返回时的锚点。Vue-router的Scroll Behavior可以用于解决这个问题&#xff0c;但是只能应用…

医疗:OA(6)

办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化技术运用到传统办公方式&#xff0c;进而形成的一种新型办公方式。办公自动化利用现代化设备和信息化技术&#xff0c;代替办公人员传统的部分手动或重复性业务活动…

高中计算机教师招聘试题,中小学信息技术教师招聘考试真题及答案.doc

中小学信息技术教师招聘考试真题及答案一、选择题(60个)1、网页都是按照一种描述文档的标记规则编写而成的&#xff0c;这套标记规则叫做&#xff1a;CA、URLB、HTTPC、HTMLD、FTP2、Basic语言属于&#xff1a;CA、机器语言B、汇编语言C、高级语言D、低级语言3、下列哪一个控件…

项目管理(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;再利用…

计算机组装维护教学总结,计算机组装与维护教学总结.doc

计算机组装与维护教学总结《计算机组装与维修》教学总结《计算机组装与维修》是职业学校计算机应用专业的一门主干专业课程.本课程是实践性较强的理论课程,其主要任务是使学生了解计算机各部件的分类、性能、选购方法,理解各主要部件的硬件结构、相互联系和作用,使学生掌握计算…

项目管理(4):备战pmp

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

HTML第七章总结

Getting started with CSS 前言 CSS 的 rule 作者做了一个非常形象的比喻&#xff0c;将 CSS 必做 renovate the house&#xff0c;在这里&#xff0c;CSS 包括了三个部分&#xff1a; Selector:the location of the HTML elementProperty:properties in that locationStyle:li…

项目管理(5):备战pmp

1项目干系人 Stakeholder 积极参与项目&#xff0c;或其利益因项目的实施或完成而受到积极或消极影响的个人或组织 他们会对项目的目标和结果施加影响 项目管理需要 识别项目干系人 确定各项目干系人的要求、期望、能发挥的作用 对其影响力尽量加以管理 如果有分歧怎么办…

js操作css样式

Div.style.width”100px"在div标签内我们添加了一个style属性&#xff0c;并设定了width值&#xff0c;这种写法会给标签带来大量的style属性&#xff0c;跟实际项目是不服的 获取css样式的方法&#xff1a;window.getComputedStyle()获取经过计算机计算的所有属性&#x…