android 仿ios开关控件

ios一些控件还是挺漂亮的,但是对android程序员来说可能比较苦逼,因为ios一些看起来简单的效果对android来说可能就没那么简单了,但是没办法很多产品都是拿ios的一些控件叫android开发人员来照着做,今天就来做一个设置中常见的开关效果,

思路:

1:准备二张图片 一个是包含开和关二种状态的图片,一个是上面滑动的按钮图片

2:这些图片肯定是不能通过原生态的控件显示上去的,要通过canvas画上去

3:要解决点击和滑动的事件冲突,因为点击包含 按下 离开,而滑动包含按下  移动 离开,

下面看代码逻辑首先是布局文件,很简单

<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"
    >
    <com.example.toggle.ui.MyToggleView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
      android:layout_centerInParent="true"
       />
</RelativeLayout>

MyToggleView.java 自定义的控件

package com.example.toggle.ui;
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.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import com.example.toggle.R;
/**
 * 一个view从创建到显示要经历的过程
 * 1:构造函数 实例初始化
 * 2:测量 onMeasure
 * 3:如果当前view是ViewGroup 还要义务测量它孩子(子view)
 * 4:指定控件的大小和位置 (onLayout)
 * 如果当前view是ViewGroup 还要义务指定它孩子的大小和位置(子view)
 * 5:绘制(就是画出来再屏幕上可见)onDraw(Canvas canvas)
 * @author Administrator
 *
 * 点击事件包含点击 和 离开  而这个离开刚好和移动中的up事件一样
 *
 */
public class MyToggleView extends View implements View.OnClickListener {
	private static final String TAG = "MyToggleView";
	Paint paint ;
	private Bitmap bg_bitmap;
	private Bitmap sliding_bitmap;
	private float slidingLeft = 0;
	private int slideLeftMax;
	/**
	 * 自定义样式用它
	 * @param context
	 * @param attrs
	 * @param defStyleAttr
	 */
	public MyToggleView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
	}
	/**
	 * 在布局时候用它
	 * @param context
	 * @param attrs
	 */
	public MyToggleView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView();
	}
	private void initView() {
		paint = new Paint();
		bg_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
		sliding_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);
		slideLeftMax = bg_bitmap.getWidth() - sliding_bitmap.getWidth();
		setOnClickListener(this);
	}
	/**
	 * 在代码new的时候用它
	 * @param context
	 */
	public MyToggleView(Context context) {
		super(context);
	}
	/**
	 * 测量
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		/**
		 * 这是父类去测量子view的大小 而我们可以不要父类去测量
		 */
//		super.onMeasure(bg_bitmap.getWidth(), bg_bitmap.getHeight());
		/**
		 * 人为指定控件测量大小 (就是说没有测量)
		 */
		setMeasuredDimension(bg_bitmap.getWidth(), bg_bitmap.getHeight());
	}
	@Override
	protected void onDraw(Canvas canvas) {
		canvas.drawBitmap(bg_bitmap, 0, 0, paint);
		canvas.drawBitmap(sliding_bitmap, slidingLeft , 0, paint);
	}
	private boolean isOpened = false;
	/**
	 * isClickenble为true表示点击事件生效 但触摸事件无效
	 * isClickenble 为false表示点击事件失效 触摸事件有效
	 */
	private boolean isClickenble = false;
	@Override
	public void onClick(View v) {
		if(isClickenble){
			isOpened = !isOpened;
			if(isOpened){
				slidingLeft = bg_bitmap.getWidth()-sliding_bitmap.getWidth();
			}else{
				slidingLeft = 0;
			}
			invalidate();
		}
	}
	private float startX = 0;//手指刚触动时候的x轴坐标
	private float lastX = 0;//手指刚触动时候的x轴坐标
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		 super.onTouchEvent(event);//执行父类的方法
		switch (event.getAction()) {//判断滑动的动作 是刚按下 还是拖动 还是手指 抬起
		case MotionEvent.ACTION_DOWN :
			lastX = startX = event.getX();//这是距离 这个控件的x轴坐标值
			isClickenble = true;
			break;
		case MotionEvent.ACTION_MOVE :
			float endX = event.getX();
			int distanceX = (int) Math.abs(endX - lastX);
			if(distanceX > 5){
				isClickenble = false;
			}
			refreshView(endX);
			startX = event.getX();//重新计算初始值
			break;
		case MotionEvent.ACTION_UP :
			if(slidingLeft>slideLeftMax/2){ //开
				isOpened = true;
				slidingLeft = slideLeftMax;
			}else{//关
				isOpened = false;
				slidingLeft = 0;
			}
			invalidate();
			break;
		}
		return true;//表示自己处理 不需要调用父类的方法
	}
	private void refreshView(float endX) {
		float distance  = (endX - startX) ;
		slidingLeft+=distance;
		if(slidingLeft<0){
			slidingLeft = 0;
		}
		if(slidingLeft>slideLeftMax){
			slidingLeft = slideLeftMax;
		}
		invalidate();
	}
}

效果图:

时间: 2024-11-04 23:16:41

android 仿ios开关控件的相关文章

JS调用Android、Ios原生控件

在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时,提高代码质量,实现两者在网页端代码的统一. 首先我们先看一下Ios调用JS的方法实现: //无参调用 function SwiftCallJs1(){} //有参调用 function SwiftCallJs2(name, message){} 紧接着我们看一下Android调用JS的方法实现: /

Android 自定义SwitchButton开关控件

SwitchButton开关控件早已经非常流行.有各种各样的样式,SwitchButton开关控件一般用于app软件设置那里,控制缓存.声音.提示.下载等等.是具有很好的UI体验以及用户的习惯性.那么再下面介绍一个SwitchButton开关控件.并附上源码. 源码下载:点击 一.看实现的效果图 二.自定义SwitchButton 这是一个继承CheckBox的SwitchButton类.来实现做这些动画效果的,首先准备好这些图片,然后canvas绘制控件 的边框.背景.以及按钮.绘制时候加上相

android自定义开关控件

近日在android项目要使用开关控件,但是android中自带的开关控件不太满意,所以就打算通过自定义View写一个开关控件 ios的开关控件当然就是我要仿照的目标. 先上图:    分析: 开关控件,中包含了两个部分,一个是一个圆,一个是圆角矩形,好了那我们只要通过view来进行绘制这两部分就可以了 直接上代码: package com.example.widget; import com.example.switchbutton_master.R; import android.conte

【iOS开发-12】UISwitch开关控件属性介绍以及获取开关状态并做出响应

(1)UISwitch的大小也是固定的,不随我们frame设置的大小改变:也是裁剪成圆角的,设置背景就露马脚发现背景是矩形. (2)UISwitch的背景图片设置无效,即我们只能设置颜色,不能用图片当背景,虽然实验了很小的图片,也是不行.可能需要借助第三方类来实现. (3)UISwitch也可以增加addTarget:方法,来获取值变动的操作,从而做出响应的反应. (4).isOn属性比较特殊,不能设置值,因为是哥getter方法,不是setter方法,所以只能获取值,例如判断是否开启,一般用在

高仿QQ顶部控件之IOS SegmentView

经常会看到QQ上面有一个 消息和电话 的顶部面板,这个空间是IOS7的分段控制,android中没有这个控件,今天在威哥的微信公众号中成功gank到这个自定义控件的实现,下面跟着尝试一波. 首先是定义文字的颜色,在res/color下新建segment_text_color_selector.xml文件 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http

Android常用酷炫控件(开源项目)github地址汇总

转载一个很牛逼的控件收集贴... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style 等等. 一.ListView android-pulltorefresh一个强大的拉动

自定义switch开关控件,实现点击和滑动效果

效果图 1. xml布局中 <com.etoury.etoury.ui.view.SlideSwitch android:id="@+id/slideSwitch3" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 2. SlideSwitch.java package com.etoury.etoury.ui.view; impo

UISwitch 开关控件

UISwitch iOS中的开关控件,只有两种状态,打开或关闭. aSwitch.tintColor = [UIColor redColor]; //关闭状态下的渲染颜色 aSwitch.onTintColor = [UIColor blueColor]; //打开状态下的渲染颜色. aSwitch.on = NO; //将其显示状态为打开 (默认关闭). aSwitch.thumbTintColor = [UIColor blackColor]; //改变switch开关按钮的颜色. [aSw

(转载)Android自定义标签列表控件LabelsView解析

Android自定义标签列表控件LabelsView解析 作者 donkingliang 关注 2017.03.15 20:59* 字数 759 阅读 406评论 0喜欢 3 无论是在移动端的App,还是在前端的网页,我们经常会看到下面这种标签的列表效果: 标签列表 标签从左到右摆放,一行显示不下时自动换行.这样的效果用Android源生的控件很不好实现,所以往往需要我们自己去自定义控件.我在开发中就遇到过几次要实现这样的标签列表效果,所以就自己写了个控件,放到我的GitHub,方便以后使用.有