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(); } } });
相关推荐
总结来说,创建自定义滑动开关的关键步骤包括: 1. 创建自定义View类,继承自CompoundButton。 2. 重写`onDraw()`方法,根据开关状态绘制不同背景。 3. 重写`onTouchEvent()`方法,处理触摸事件,更新开关状态。 4....
通过学习和实践自定义滑动开关的开发,你不仅可以提升自己的Android编程技能,还能更好地理解和控制应用的视觉表现和交互行为。记得在实际项目中进行测试,确保自定义开关在各种设备和屏幕尺寸上都能正常工作。
这篇博客文章的配套源码提供了一个自定义滑动开关的实现,让我们深入探讨这个自定义控件的设计和实现。 首先,滑动开关的基本原理是利用Android的View类或者CompoundButton类进行扩展。在这个例子中,开发者可能...
总结一下,创建一个自定义滑动开关控件需要理解Android的绘图机制、事件处理以及自定义视图的生命周期。通过合理的布局设计和动画处理,可以实现美观且功能完备的滑动开关。在实际项目中,这样的自定义控件能够更好...
以上就是实现Android自定义滑动开关的两种主要方式,以及如何通过自定义属性进行样式定制。理解并掌握这些知识点,开发者可以在应用中创造出独特且富有交互性的用户界面。同时,自定义View也是提升个人技能和项目...
本篇将深入探讨如何在Android中自定义`Switch Button`,打造既漂亮又美观的滑动开关。 首先,自定义`Switch Button`涉及的主要方面包括布局设计和动画效果。布局设计通常通过XML实现,可以调整开关的背景、文字颜色...
3. **触摸事件处理**:重写`onTouchEvent()`来响应用户的触摸操作,当用户滑动开关时,更新开关的状态并触发相应的回调。 4. **动画效果**:为了模仿iOS开关滑动的平滑过渡,可以使用`ObjectAnimator`或者自定义...
自定义滑动开关是Android开发中的一个重要实践,它涉及到对Android UI组件的理解、触摸事件的处理、绘图技术以及动画的应用。通过这个过程,开发者不仅可以提升自己的编程技巧,还能更好地理解和控制应用的界面表现...
总的来说,自定义滑动开关和切换按钮涉及到Android的图形绘制、动画处理、事件监听等多个方面,需要对Android SDK有深入的理解。通过自定义,我们可以创造出更符合应用需求的交互体验,提升用户的使用感受。实践中,...
"android之自定义开关控件"这个主题旨在教你如何在Android平台上创建一个类似苹果iOS Toggle的自定义开关组件。以下是对这个主题的详细讲解: 一、基础知识 在Android中,开关系列的控件主要包括Switch和...
android三档自定义滑动开关禁止点击功能的实现,用默认的seekbar组件实现.doc
"android自定义滑动按钮"是一个专题,旨在教你如何在Android平台上创建一个具有滑动手势的开关按钮,这种控件通常用于开启或关闭某个功能,如Wi-Fi、蓝牙等。下面将详细解释这个知识点。 一、自定义滑动按钮的基本...
- 实现滑动事件,当用户滑动开关时,更新开关的状态并触发相应的逻辑。 4. **ios风格的switchButton**: - iOS的开关按钮通常具有独特的设计风格,包括滑块部分和背景色的平滑过渡。在Android中,我们可以模仿...
在Android开发中,滑动开关(Switch)是一种常见的UI组件,用于用户进行是/否或者开/关的选择。它提供了一种直观、易用的交互方式,用户只需轻轻一滑,就能切换状态。本教程将深入讲解如何在Android应用中创建和定制...
本文将深入探讨如何使用Android自定义View来实现一个仿iOS风格的开关控件。首先,我们需要了解自定义View的基本流程和关键组件。 一、自定义View基础 自定义View通常涉及到以下步骤: 1. 创建一个新的类,继承自`...
- 在Android中,可以使用`SwitchCompat`(AppCompat库)或自定义视图(`View`或`ViewGroup`)来创建自定义滑动开关。 - 在iOS中,可以使用`UISwitch`并修改其属性,或者创建自定义的Swift或Objective-C类来实现。 ...
首先,`SwitchButton`是Android中的一个滑动开关控件,通常用于开启或关闭某项功能。原生的`android.widget.Switch`虽然能满足基本需求,但有时我们可能需要自定义更丰富的视觉效果或者交互行为。创建自定义`...