自定义view_开关

Android 自定义View实现开关效果 前言:Android自定义View对于刚入门乃至工作几年的程序员来说都是非常恐惧的,但也是Android进阶学习的必经之路,平时项目中经常会有一些苛刻的需求,我们可以在GitHub上找到各种各样的效果,能用则用,不能用自己花功夫改改也能草草了事。不过随着工作经验和工作性质,越来越觉得自定义View是时候有必要自己花点功夫研究一下。 一、经过这两天的努力,自己也尝试着写了一个Demo,效果很简单,就是 阅读详情
</pre><pre name="code" class="java">
</pre><pre name="code" class="java">
</pre><pre name="code" class="java">
自己写的一个自定义的开关
准备两张开关图片,一张为开关背景,一张的覆盖在上面的开关按钮
代码注释很详细

package com.example.customswitch;

import android.content.Context;
import android.drm.DrmStore.Action;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;

/**
*继承view
*/
public class MyToggleButton extends View implements OnClickListener{

	private Bitmap backgroundBitmap;//作为背景的图片
	private Bitmap slidebutton;//
	private Paint mPaint;//画笔
	private float slidBtn_left;//滑动按钮的左边界
	private boolean isBtnOpen = false;//当前开关状态,true为开
	
	
	/**
	 * 在代码里面创建对象时使用的方法
	 * @param context
	 */
	public MyToggleButton(Context context) {
		super(context);
	}
	/**
	 * 在布局文件中声明的view,创建时由系统自动调用
	 * @param context
	 * @param attrs
	 */
	public MyToggleButton(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView();
	}
	/**
	 * 与第二个构造法相似,多了一个样式
	 * @param context
	 * @param attrs
	 * @param defStyle
	 */
	public MyToggleButton(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}
	/*
	 * 一个View对象显示在屏幕上的几个重要步骤
	 * 1、构造方法创建对象
	 * 2、测量view大小:系统测量,onMeasure(int int)
	 * 3、确定view的位置,view自身有一些建议权,决定权在父view手中: onLayout()
	 * 4、绘制view的内容:onDraw(canvas)
	 */
	
	/**
	 * 测量尺寸时的回调方法
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		/**
		 * 设置当前view的大小
		 * width:view的宽
		 * height:view的高(单位:像素)
		 */
		setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());//设置当前view的大小为背景大小
		
	}
	/**
	 * 确定位置时调用此方法
	 * 自定义view时作用不大
	 * 对自定义viewGroup作用大
	 */
	@Override
	protected void onLayout(boolean changed, int left, int top, int right,
			int bottom) {
		// TODO Auto-generated method stub
		super.onLayout(changed, left, top, right, bottom);
	}
	
	/**
	 * 绘制当前view内容
	 */
	@Override
	protected void onDraw(Canvas canvas) {
		//绘制背景
		canvas.drawBitmap(backgroundBitmap, 0, 0, mPaint);
		//绘制可以滑动的按钮
		
		canvas.drawBitmap(slidebutton, slidBtn_left, 0, mPaint);
		
	}
	/*
	 * 初始化
	 */
	private void initView() {
		//初始化图片
		backgroundBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.switch_background);
		slidebutton = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);
		//初始化画笔
		mPaint = new Paint();
		mPaint.setAntiAlias(true);//打开抗锯齿
		mPaint.setColor(Color.BLUE);
		//添加onclick事件监听
		setOnClickListener(this);
		
	}
	
	private boolean isDrag = false;//判断是否发生拖动,如果拖动了,就不再响应onclick事件
	/**
	 * onclick事件在view.onTouchEvent中被解析
	 * 系统对onclick事件的解析过于简陋
	 * 只要有down事件和up事件,系统就认为发生了onclick事件
	 */
	@Override
	public void onClick(View v) {
		
		if(!isDrag){//没有拖动才响应onclick
			isBtnOpen = !isBtnOpen;
			refreshState();	
		}
		
	}
	/**
	 * 刷新当前状态
	 */
	private void refreshState() {
		if(isBtnOpen){
			slidBtn_left = backgroundBitmap.getWidth()-slidebutton.getWidth();
		}else{
			slidBtn_left = 0;
		}
		/**
		 * 刷新当前view,
		 * 如果当前view是可见状态,则会重新调用onDraw方法
		 */
		invalidate();
	}
	/**
	 * Down事件时的X值
	 */
	private int firstX;
	/**
	 * touch事件的上一个X值
	 */
	private int lastX;
	
	public boolean onTouchEvent(MotionEvent event) {
		
		super.onTouchEvent(event);//oncick事件在super.onTouchEvent中解析
		
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			isDrag = false;
			
			firstX = (int) event.getX();
			lastX = firstX;
			
			break;
			
		case MotionEvent.ACTION_MOVE:
			//是否发生了拖动
			if(Math.abs(event.getX()-firstX) > 10){
				isDrag = true;
			}
			
			//计算手指在屏幕上滑动的距离
			int dis = (int) (event.getX()-lastX);
			//将本次的位置设置给lastX
			lastX = (int) event.getX();
			//根据手指移动的距离,改变slideBtn_left
			slidBtn_left = slidBtn_left + dis;
			
			break;
			
		case MotionEvent.ACTION_UP:
			
			if(isDrag){
				int maxLeft = backgroundBitmap.getWidth()-slidebutton.getWidth();
				/**
				 * 
				 */
				if(slidBtn_left>(maxLeft/2)){
					isBtnOpen = true;
				}else{
					isBtnOpen = false;
				}
				
				refreshState();
			}
			
			break;
			
		}
		
		flushView();
		
		return true;//如果设置为true则完全拦截下来
	}
	/**
	 * 刷新当前视图
	 */
	private void flushView() {
		//对slidBtn_left的值判断,确保其位置合理
		int maxLeft = backgroundBitmap.getWidth()-slidebutton.getWidth();
		//确保slidBtn_left范围,如果超出范围,则给一个边界值
		slidBtn_left = (slidBtn_left>0)?slidBtn_left:0;
		slidBtn_left = (slidBtn_left<maxLeft)?slidBtn_left:maxLeft;
		
		invalidate();
	}

}

自定义view_开关按钮 android之自定义view,点击图片按钮或拖动图片按钮控制开关,一起学习吧。 立即下载

相关推荐

求无向图中所有的环 C++ python

求无向图中所有的环

random_repick的专栏 1151

自定义View之自定义开关

看了自定义view的教学视频,今天来总结一下 首先来看一下效果 这是开的效果 这是关的效果 接下来看看代码: 1.先把开关图形弄出来 首先这是自定义view中的继承自view的一种,所以我们要新建一个类继承自view,重写里面的构造方法,构造方法有几个,这里我们先选两个参数的,这个构造方法会在我们在布局文件中生成时调用,同时我们可以在里面写一些初始化的工

wo_Iving的博客 487

振动分析中相位的确定

更是定位不平衡量角度的关键。是确定振动信号与转子旋转位置之间时间关系的核心步骤,而。以内,以确保校正配重安装角度的有效性。在实际动平衡中,相位角的误差需控制在。在振动分析和动平衡中,

轩辕霸天L 2735

android 高仿ios开关,Android自定义view仿IOS开关效果

本文主要讲解如何在 Android 下实现高仿 iOS 的开关按钮,并非是在 Android 自带的 ToggleButton 上修改,而是使用 API 提供的 onDraw、onMeasure、Canvas 方法,纯手工绘制。基本原理就是在 Canvas 上叠着放两张图片,上面的图片根据手指触摸情况,不断移动,实现开关效果。废话不说,上效果图,看看怎么样样式如下:网上也有实现这种效果的,但是大都...

weixin_33256627的博客 973

神领物流-day01-项目概述

公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。

心飞为你飞 2255

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 375

android 自定义开关键设置大小,Android自定义View实现开关按钮

前言:Android自定义View对于刚入门乃至工作几年的程序员来说都是非常恐惧的,但也是Android进阶学习的必经之路,平时项目中经常会有一些苛刻的需求,我们可以在GitHub上找到各种各样的效果,能用则用,不能用自己花功夫改改也能草草了事。不过随着工作经验和工作性质,越来越觉得自定义View是时候有必要自己花点功夫研究一下。一、经过这两天的努力,自己也尝试着写了一个Demo,效果很简单,就是...

weixin_32843345的博客 530

Setup&Hold互卡问题和Useful Skew的影响

setup和hold互卡问题分析

godping的博客 5093

自定义View之开关

自定义View

趣学程序 679

武汉大学朱玉贤院士团队再发Nature Genetics,阐述棉花独特折叠胚胎形成的分子调控与演化机制

武汉大学朱玉贤院士团队再发Nature Genetics,阐述棉花独特折叠胚胎形成的分子调控与演化机制。

Pangenes的博客 1335

5G射频到底是啥?方案怎么搭?工作流程、SAW选型、PA选型一口气讲透(工程师秒懂版)

很多人一提 5G 射频,脑子里先冒出来的是几个零件名:👉 PA👉 LNA👉 SAW👉 天线👉 开关但真正做方案时,这些东西不是一堆分立器件,而是一条完整的“信号流水线”。更准确地说,。Qualcomm 对 RFFE 的定义就是“把信息转换成可发送的射频信号,并把接收到的信号转换回有用信息”的那一整套组件。

weixin_43199439的博客 533

自定义View实例(三)滑动开关

自定义View的步骤 通过继承view类自定义view步骤如下 实现view构造方法 测量view的大小,即重写onMeasure方法 绘制view,即重写onDraw方法 继承自view一般不需要重写onLayout方法 这次我们实现一个滑动的开关,效果见图: 代码中有详细的注释如下: package com.car.customview.view; import android.cont...

xj531的博客 827

C++实现复制粘贴文本功能

要实现这个功能,我们需要使用操作系统提供的函数来操作剪贴板。在Windows操作系统中,我们可以使用Windows API函数来访问剪贴板。总结起来,使用C++实现复制和粘贴文本功能涉及使用操作系统提供的API函数来操作剪贴板。在本篇文章中,我将向您展示如何使用C++编程语言实现复制和粘贴文本的功能。我们将使用操作系统提供的API来进行剪贴板操作,并编写相应的代码来完成这个任务。如果您使用的是Linux操作系统,您需要使用适当的库和函数来访问剪贴板。函数中,我们首先将一个字符串复制到剪贴板中,然后使用。

PixelDyno的博客 1233

android自定义view实现开关

下面是一个自定义view实现的开关,方法使用并且附加监听 1、自定义view代码 package com.android.sf.view; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.g

Android小飞の博客 1795

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

自定义View实现开关效果

自定义View实现开关按钮步骤:写个类继承View,拷贝包含包名的全路径到xml中,界面中找到该控件, 设置初始信息,根据需求绘制界面内容,响应用户的触摸事件,创建一个状态更新监听.显示开关背景和滑动按钮。重写Android绘制渲染函数onMeasure(),onLayout(),onDraw()可以跟随着触摸滑动,重写TouchEvent()返回true避免阻断其他事件。开关状态事件监听。定义...

jun_tong的博客 343

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android自定义view生命周期,Android自定义view仿IOS开关效果

Android自定义view仿IOS开关效果发布时间:2020-09-22 01:10:30来源:脚本之家阅读:135作者:AND_Devil本文主要讲解如何在 Android 下实现高仿 iOS 的开关按钮,并非是在 Android 自带的 ToggleButton 上修改,而是使用 API 提供的 onDraw、onMeasure、Canvas 方法,纯手工绘制。基本原理就是在 Canvas ...

weixin_34638409的博客 210

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

自定义view实现开关效果并使用接口回调

自定义view实现开关,并且使用接口回调 public class MyTaggButton extends View implements View.OnClickListener,View.OnTouchListener{ private Paint paint; private Bitmap switch_background; private Bitmap si...

技术小白 503

自定义View(自定义buttom开关)myswitchbutton

布局:&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="

jun_tong的博客 361

STM32+数字隔离器实现SPI隔离的完整设计实战

在工业现场,地电位差和共模干扰是嵌入式通信的两大隐形杀手,尤其对SPI这类同步串行协议,一旦隔离不当,轻则数据乱码,重则烧毁控制器引脚。数字隔离器通过电容或电感耦合传递信号,相比光耦具有更低的传播延迟和更好的通道对称性,能从物理上切断地环路,同时保障高速时序稳定。基于STM32F427与数字隔离器的组合,工程师可以在电机控制、传感器采集等场景中可靠地实现SPI链路隔离,兼顾电气安全与传输效率。本文从器件选型、通道分配到PCB布局,再到底层固件与调试经验,完整拆解了一套可落地的工业级SPI隔离方案,并重点梳理

weixin_30357231的博客 349

自定义开关锁 View

OvalLockView 项目地址:zhpanvip/OvalLockView  简介:自定义开关锁 View 更多:作者   提 Bug    标签:   动画效果

未来很长,但我会努力的走下去。 215

android自定义一组按钮,Android自定义View之自定义开关按钮

一、效果展示 二、相关链接三、自定义View的具体步骤1、首先需要写一个类来继承自View(或者View的子类)2、需要得到view的对象(并初始化变量),那么需要重写构造方法,其中一参的构造方法用于new,二参的构造方法用于xml布局文件使用,三参的构造方法可以传入一个样式。3、需要设置view的大小,那么需要重写onMeasure方法4、需要设置view的位置,那么需要重写onLayout方...

weixin_39719101的博客 519

自定义view————开关button

陷入自定义view的坑越陷越深,励志要把自定义view撸给遍,今天给大家介绍一下自定义view————开关button,这个在很多app中都能用的,废话不多说,先来给动图。 效果图 分析一下上面的效果:四个状态:关闭状态、关闭-&gt;打开过程、打开状态、打开-&gt;关闭过程,结合ValueAnimator动效实现这个过程 关闭状态 绘制一个圆角矩形(drawRoundRect()方法),...

weixin_34408624的博客 217

自定义View:仿ios开关按钮控件

尊重他人的劳动成果,转载请标明出处:http://blog.youkuaiyun.com/gengqiquan/article/details/51699976, 本文出自:【gengqiquan的博客】 新项目有个提醒开关这么个功能,UI给的图当然是按ios来的,当然了,设计妹子考虑到了安卓的处境,给了两个背景图来切换,不过使用起来怎么看都不完美,很僵硬的感觉,作为一个有追求有审美的开发者,当然不能忍

gengqiquan的博客 4738

Android自定义View开关

Android自定义开关 /** * 1.创建一个类,继承VIew * 2.覆写三个构造方法,进行对象的初始化操作 * 3.覆写OnMeasure,确定控件的宽高大小 * 4.覆写OnDrawer,绘制出控件的静态效果 * 5.实现点击滑动按钮的效果,View类具备点击监听 * 6.覆写手势监听,实现滑动根据手指滑动而移动 * 7.完善手势监听,实现滑到中间的时候,能...

攀岩嘉 250
下一篇: 第三方库
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值