`

Android自定义滑动开关

阅读更多
package com.weijie.user.component;

import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.weijie.user.R;

public class SwitchView extends LinearLayout {
	private ImageView maskImage;              // 开关遮盖图片
	private boolean open;                     // 开关当前状态
	private boolean isAninFinish = true;      // 动画是否结束
	private float x;                          // 记录ACTION_DOWN时候的横坐标
	private boolean isChangedByTouch = false; // 是否在一次事件中已经切换过状态
	private OnSwitchChangeListener switchChangeListener; // 监控开关状态

	public interface OnSwitchChangeListener {
		void onSwitchChanged(boolean open);
	}

	public SwitchView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public SwitchView(Context context) {
		super(context);
		init();
	}

	private void init() {
		setBackgroundResource(R.drawable.switch_bg);
		maskImage = new ImageView(getContext());
		maskImage.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
		maskImage.setImageResource(R.drawable.switch_mask);
		addView(maskImage);
	}

	public boolean getSwitchStatus() {
		return open;
	}

	public void setSwitchStatus(boolean isOpen) {
		this.open = isOpen;
		if (isOpen) {
			setGravity(Gravity.RIGHT);
		} else {
			setGravity(Gravity.LEFT);
		}
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN: {
			x = event.getX();
			break;
		}
		case MotionEvent.ACTION_MOVE: {
			if (event.getX() - x > 5 && !open) { // 向右
				changeStatus();
			} else if (event.getX() - x < -5 && open) { // 向左
				changeStatus();
			}
			break;
		}
		case MotionEvent.ACTION_UP: {
			if (Math.abs(event.getX() - x) <= 5) {
				changeStatus();
			}
			isChangedByTouch = false;
			break;
		}
		case MotionEvent.ACTION_CANCEL: {
			isChangedByTouch = false;
			break;
		}
		}
		return true;
	}
	
	private void changeStatus() {
		if (isAninFinish && !isChangedByTouch) {
			isChangedByTouch = true;
			open = !open;
			isAninFinish = false;
			if (switchChangeListener != null) {
				switchChangeListener.onSwitchChanged(open);
			}
			changeOpenStatusWithAnim(open);
		}
	}

	private void changeOpenStatusWithAnim(boolean open) {
		if (open) {
			// 左到右
			Animation leftToRight = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, 
					Animation.ABSOLUTE, getWidth() - maskImage.getWidth(), 
					Animation.RELATIVE_TO_SELF, 0, 
					Animation.RELATIVE_TO_SELF, 0);
			leftToRight.setDuration(300);
			leftToRight.setAnimationListener(new AnimationListener() {
				@Override
				public void onAnimationStart(Animation animation) {
				}

				@Override
				public void onAnimationRepeat(Animation animation) {
				}

				@Override
				public void onAnimationEnd(Animation animation) {
					maskImage.clearAnimation();
					setGravity(Gravity.RIGHT);
					isAninFinish = true;
				}
			});
			maskImage.startAnimation(leftToRight);
		} else {
			// 右到左
			Animation rightToLeft = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0,
					Animation.ABSOLUTE, maskImage.getWidth() - getWidth(), 
					Animation.RELATIVE_TO_SELF, 0, 
					Animation.RELATIVE_TO_SELF, 0);
			rightToLeft.setDuration(300);
			rightToLeft.setAnimationListener(new AnimationListener() {
				@Override
				public void onAnimationStart(Animation animation) {
				}

				@Override
				public void onAnimationRepeat(Animation animation) {
				}

				@Override
				public void onAnimationEnd(Animation animation) {
					maskImage.clearAnimation();
					setGravity(Gravity.LEFT);
					isAninFinish = true;
				}
			});
			maskImage.startAnimation(rightToLeft);
		}
	}

	public OnSwitchChangeListener getSwitchChangeListener() {
		return switchChangeListener;
	}

	public void setOnSwitchChangeListener(OnSwitchChangeListener switchChangeListener) {
		this.switchChangeListener = switchChangeListener;
	}
	
}

 

SwitchView wiper_switch = (SwitchView) convertView.findViewById(R.id.wiper_switch);
		final Attention attention = (Attention) getItem(position);
		holder.shop_name.setText(attention.name);
		if("1".equals(attention.status)){//已关注
			wiper_switch.setSwitchStatus(true);
		}else{
			wiper_switch.setSwitchStatus(false);
		}
		wiper_switch.setOnSwitchChangeListener(new OnSwitchChangeListener() {
			
			@Override
			public void onSwitchChanged(boolean open) {
				if(open == true){
					modifyAttention(attention.id, "1");
		            Toast.makeText(context,"关注成功" , Toast.LENGTH_SHORT).show(); 
				}else{ 
					modifyAttention(attention.id, "0");
		            Toast.makeText(context,"取消成功" , Toast.LENGTH_SHORT).show(); 
		        }
			}
		});

 

  • 大小: 692 Bytes
分享到:
评论

相关推荐

    Android 自定义滑动开关

    总结来说,创建自定义滑动开关的关键步骤包括: 1. 创建自定义View类,继承自CompoundButton。 2. 重写`onDraw()`方法,根据开关状态绘制不同背景。 3. 重写`onTouchEvent()`方法,处理触摸事件,更新开关状态。 4....

    android 自定义滑动开关

    通过学习和实践自定义滑动开关的开发,你不仅可以提升自己的Android编程技能,还能更好地理解和控制应用的视觉表现和交互行为。记得在实际项目中进行测试,确保自定义开关在各种设备和屏幕尺寸上都能正常工作。

    android自定义控件滑动开关源码

    这篇博客文章的配套源码提供了一个自定义滑动开关的实现,让我们深入探讨这个自定义控件的设计和实现。 首先,滑动开关的基本原理是利用Android的View类或者CompoundButton类进行扩展。在这个例子中,开发者可能...

    Android自定义控件之滑动开关

    总结一下,创建一个自定义滑动开关控件需要理解Android的绘图机制、事件处理以及自定义视图的生命周期。通过合理的布局设计和动画处理,可以实现美观且功能完备的滑动开关。在实际项目中,这样的自定义控件能够更好...

    Android自定义View控件滑动开关的实现,两种方式,自定义属性

    以上就是实现Android自定义滑动开关的两种主要方式,以及如何通过自定义属性进行样式定制。理解并掌握这些知识点,开发者可以在应用中创造出独特且富有交互性的用户界面。同时,自定义View也是提升个人技能和项目...

    安卓 android 自定义 switch button,滑动开关

    本篇将深入探讨如何在Android中自定义`Switch Button`,打造既漂亮又美观的滑动开关。 首先,自定义`Switch Button`涉及的主要方面包括布局设计和动画效果。布局设计通常通过XML实现,可以调整开关的背景、文字颜色...

    Android自定义IOS开关

    3. **触摸事件处理**:重写`onTouchEvent()`来响应用户的触摸操作,当用户滑动开关时,更新开关的状态并触发相应的回调。 4. **动画效果**:为了模仿iOS开关滑动的平滑过渡,可以使用`ObjectAnimator`或者自定义...

    Android自定义——滑动开关

    自定义滑动开关是Android开发中的一个重要实践,它涉及到对Android UI组件的理解、触摸事件的处理、绘图技术以及动画的应用。通过这个过程,开发者不仅可以提升自己的编程技巧,还能更好地理解和控制应用的界面表现...

    自定义滑动开关和切换按钮

    总的来说,自定义滑动开关和切换按钮涉及到Android的图形绘制、动画处理、事件监听等多个方面,需要对Android SDK有深入的理解。通过自定义,我们可以创造出更符合应用需求的交互体验,提升用户的使用感受。实践中,...

    android之自定义开关控件

    "android之自定义开关控件"这个主题旨在教你如何在Android平台上创建一个类似苹果iOS Toggle的自定义开关组件。以下是对这个主题的详细讲解: 一、基础知识 在Android中,开关系列的控件主要包括Switch和...

    android三档自定义滑动开关

    android三档自定义滑动开关禁止点击功能的实现,用默认的seekbar组件实现.doc

    android自定义滑动按钮

    "android自定义滑动按钮"是一个专题,旨在教你如何在Android平台上创建一个具有滑动手势的开关按钮,这种控件通常用于开启或关闭某个功能,如Wi-Fi、蓝牙等。下面将详细解释这个知识点。 一、自定义滑动按钮的基本...

    android 自定义开关按钮

    - 实现滑动事件,当用户滑动开关时,更新开关的状态并触发相应的逻辑。 4. **ios风格的switchButton**: - iOS的开关按钮通常具有独特的设计风格,包括滑块部分和背景色的平滑过渡。在Android中,我们可以模仿...

    android的滑动开关小插件

    在Android开发中,滑动开关(Switch)是一种常见的UI组件,用于用户进行是/否或者开/关的选择。它提供了一种直观、易用的交互方式,用户只需轻轻一滑,就能切换状态。本教程将深入讲解如何在Android应用中创建和定制...

    android自定义开关控件

    本文将深入探讨如何使用Android自定义View来实现一个仿iOS风格的开关控件。首先,我们需要了解自定义View的基本流程和关键组件。 一、自定义View基础 自定义View通常涉及到以下步骤: 1. 创建一个新的类,继承自`...

    自定义滑动开关

    - 在Android中,可以使用`SwitchCompat`(AppCompat库)或自定义视图(`View`或`ViewGroup`)来创建自定义滑动开关。 - 在iOS中,可以使用`UISwitch`并修改其属性,或者创建自定义的Swift或Objective-C类来实现。 ...

    android自定义选择开关switchButton

    首先,`SwitchButton`是Android中的一个滑动开关控件,通常用于开启或关闭某项功能。原生的`android.widget.Switch`虽然能满足基本需求,但有时我们可能需要自定义更丰富的视觉效果或者交互行为。创建自定义`...

Global site tag (gtag.js) - Google Analytics