`

类似iphone滑动按钮效果

 
阅读更多

先上一张效果图:

以后大家在设计UI时,可以将那些开关型的功能模块使用上述UI原型进行改造:)


DragTab.java文件:
package com.example.ex.view;

import com.example.ex.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

public class DragTab extends FrameLayout {

	private CallDragTab callTab;
	private int currentTab = -1;
	private TextView game;
	private TextView app;
	private TextView between;
	private int width;
	private OnClickListener gameOnClickListener;
	private OnClickListener appOnClickListener;
	private boolean right;
	private int widgetWidth;
	private int betweenLeft;
	private int firstX;

	public DragTab(Context context) {
		super(context);
		callTab = (CallDragTab) context;
	}

	public DragTab(Context context, AttributeSet attrs) {
		super(context, attrs);
		callTab = (CallDragTab) context;
	}

	public void setCurrentDrayTab(int curTab) {
		setCurrentDrayTab(curTab, false);
	}

	public void setGameText(int redId) {
		if (redId > 0) {
			this.game.setText(redId);
		}
	}

	public void setGameText(String text) {
		if (text != null && text.length() != 0) {
			this.game.setText(text);
		}
	}

	public void setAppText(int redId) {
		if (redId > 0) {
			this.app.setText(redId);
		}
	}

	public void setAppText(String text) {
		if (text != null && text.length() != 0) {
			this.app.setText(text);
		}
	}

	public void setBetweenText(int redId) {
		if (redId > 0) {
			this.between.setText(redId);
		}
	}

	public void setBetweenText(String text) {
		if (text != null && text.length() != 0) {
			this.between.setText(text);
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		final int action = ev.getAction();
		final int moveX = (int) ev.getX();
		final int scape = moveX - firstX;
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			firstX = (int) ev.getX();
			break;
		case MotionEvent.ACTION_MOVE:
			move(scape);
			break;
		case MotionEvent.ACTION_UP:
			if (currentTab == 1) {
				if (betweenLeft != 0) {
					animationStart(-betweenLeft, 0);
				}

				callTab.getData(1);
			} else if (currentTab == 2) {
				if (betweenLeft != width) {
					animationStart(betweenLeft, width);
				}
				callTab.getData(2);
			}
			break;
		}
		return true;
	}

	private void animationStart(int left, int leftMargin) {
		TranslateAnimation trans = new TranslateAnimation(
				Animation.RELATIVE_TO_SELF, 0, Animation.ABSOLUTE,
				left / width, Animation.RELATIVE_TO_SELF, 0,
				Animation.RELATIVE_TO_SELF, 0);
		trans.setStartOffset(0);
		trans.setDuration(100);
		trans.setFillBefore(false);
		between.startAnimation(trans);
		setLayoutParams(leftMargin);
	}

	private void move(int scape) {
		LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) between
				.getLayoutParams();
		betweenLeft = between.getLeft();
		if (width <= scape) {
			lp.leftMargin = width;
		} else if (scape <= 0) {
			if (betweenLeft == width) {
				right = true;
			} else if (betweenLeft == 0) {
				right = false;
			}
			if (right) {
				lp.leftMargin = width + scape;
				if (lp.leftMargin <= 0) {
					lp.leftMargin = 0;
				}
			} else {
				lp.leftMargin = scape;
				if (lp.leftMargin <= 0) {
					lp.leftMargin = 0;
				}
			}
		} else if (scape > 0 && width > scape) {
			lp.leftMargin = scape;
			if (betweenLeft == width) {
				lp.leftMargin = width;
			}
		}
		if (widgetWidth / 3 <= betweenLeft) {
			setCurrentDrayTab(2);
		} else if (widgetWidth / 3 >= betweenLeft) {
			setCurrentDrayTab(1);
		}
		between.setLayoutParams(lp);
	}

	public void setCurrentDrayTab(int curTab, boolean isSetLayoutParams) {
		if (currentTab == curTab) {
			return;
		}
		currentTab = curTab;
		if (curTab == 1) {
			game.setVisibility(INVISIBLE);
			app.setVisibility(VISIBLE);
			between.setText(game.getText());
			if (isSetLayoutParams) {
				setLayoutParams(0);
			}
		} else if (curTab == 2) {
			app.setVisibility(INVISIBLE);
			game.setVisibility(VISIBLE);
			between.setText(app.getText());
			if (isSetLayoutParams) {
				setLayoutParams(width);
			}
		}
	}

	@Override
	protected void onFinishInflate() {
		game = (TextView) findViewById(R.id.game);
		app = (TextView) findViewById(R.id.app);
		between = (TextView) findViewById(R.id.between);
		LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) between
				.getLayoutParams();
		widgetWidth = lp.width;
		width = (int) (widgetWidth / 1.0);
	}

	private void setLayoutParams(int leftMargin) {
		LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) between
				.getLayoutParams();
		lp.leftMargin = leftMargin;
		between.setLayoutParams(lp);
	}

	public void setGameClickListener(OnClickListener listener) {
		if (listener != null) {
			this.gameOnClickListener = listener;
			this.game.setOnClickListener(gameOnClickListener);
		}
	}

	public void setAppClickListener(OnClickListener listener) {
		if (listener != null) {
			this.appOnClickListener = listener;
			this.app.setOnClickListener(appOnClickListener);
		}
	}

	public interface CallDragTab {
		void getData(int curTab);
	}
}



SlideButtonActivity.java:
package com.example.ex;

import com.example.ex.view.DragTab;
import com.example.ex.view.DragTab.CallDragTab;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class SlideButtonActivity extends Activity implements CallDragTab {

	private DragTab mDragTab;
	private int currentClick = -1;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		mDragTab = (DragTab) findViewById(R.id.self_tab);
		mDragTab.setCurrentDrayTab(1);
		mDragTab.setGameClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mDragTab.setCurrentDrayTab(1, true);
				getData(1);
			}
		});
		mDragTab.setAppClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mDragTab.setCurrentDrayTab(2, true);
				getData(2);
			}
		});

		getData(1);
	}

	@Override
	public void getData(int curTab) {
		if (currentClick == curTab) {
			return;
		}
		currentClick = curTab;
		if (curTab == 1) {
			Toast.makeText(this, "游戏", Toast.LENGTH_LONG).show();
		} else if (curTab == 2) {
			Toast.makeText(this, "应用", Toast.LENGTH_LONG).show();
		}

	}
}


main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<include layout="@layout/self_tab" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:id="@+id/self_tab" />
</LinearLayout>


self_tab.xml:
<?xml version="1.0" encoding="utf-8"?>
<com.example.ex.view.DragTab
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="200dp" android:layout_height="wrap_content">
	<LinearLayout android:layout_width="200dp"
		android:layout_height="wrap_content" android:background="@drawable/rank_long">
		<TextView android:id="@+id/game" android:layout_width="100dp"
			android:layout_height="wrap_content" android:text="游戏"
			android:textSize="16sp" android:textColor="#000000" android:gravity="center_horizontal"
			android:layout_gravity="center" />
		<TextView android:id="@+id/app" android:layout_width="100dp"
			android:layout_height="wrap_content" android:text="应用"
			android:textSize="16sp" android:textColor="#000000" android:gravity="center_horizontal"
			android:layout_gravity="center" />
	</LinearLayout>
	<LinearLayout android:layout_width="200dp"
		android:layout_height="wrap_content">
		<TextView android:id="@+id/between" android:layout_width="100dp"
			android:layout_height="wrap_content" android:background="@drawable/rank_short"
			android:text="游戏" android:textSize="16sp" android:textColor="#000000"
			android:gravity="center" />
	</LinearLayout>
</com.example.ex.view.DragTab>


本来不想附上源码的,因为代码都贴在这了,还是附上吧,也许有的人需要现成的东东!!!!
  • 大小: 9.3 KB
分享到:
评论
8 楼 龙哥IT 2012-06-27  
7 楼 yangchch786 2011-12-11  
学习了,有个小bug,就是当向左拖动时,scape<0时出现的bug,已经改过
发一下出来。
if(widgetWidth/3 <= lp.leftMargin){
setCurrentDrayTab(2);
}else if(widgetWidth / 3 >= lp.leftMargin){
setCurrentDrayTab(1);
}
这里需要用lp.leftMargin,不用betweenLeft。

if(right){
lp.leftMargin = width + scape;
if(lp.leftMargin<=0){
lp.leftMargin = 0;
}
}else{
lp.leftMargin = 0;
}
这里当right==false时,就把lp.leftMargin设置为0.
6 楼 qjx1987904 2011-12-03  
很不错,学习了
5 楼 bear1122ccc 2011-10-08  
private int width; 这个宽度是代表什么啊?
private int currentTab = -1; 这个又代表哪种状态啊?
4 楼 bear1122ccc 2011-10-08  
求代码注释。
3 楼 huanzi5566 2011-09-05  
哇  真厉害
2 楼 lemonboxs 2011-08-19  
很好,解决了我的问题。
1 楼 pcq019 2011-08-17  
48个浏览,居然没人回复,我来谢谢你啦~

相关推荐

    自定义SlipButton和高仿iphone 滑动按钮

    "自定义SlipButton和高仿iPhone滑动按钮"就是一个这样的实践,它旨在为Android应用添加一个模仿iPhone滑动开关的组件。这个组件通常被称为滑动开关(Switch)或滑动选择器(Slider),它允许用户通过简单的滑动动作...

    Android 仿 Iphone 滑动按钮(SlipButton)

    在Android开发中,为了提供与iOS设备类似的用户体验,开发者经常需要实现特定的UI元素,例如Iphone上的滑动按钮(SlipButton)。本教程将详细讲解如何在Android中创建一个仿照iPhone风格的滑动按钮,并探讨其核心原理...

    Android 仿 iPhone 自定义滑动按钮

    通过以上步骤,我们便可以在Android应用中实现一个类似iPhone的滑动按钮。这种自定义组件不仅可以提高应用的视觉一致性,还能增强用户体验。需要注意的是,在实际开发中,还需要考虑滑动按钮的触碰区域、滑动阻力等...

    Android仿iphone滑动解锁,先看效果,代码另行上传

    Android仿iphone滑动解锁,此为APK,如果觉得效果不错,可以在我的资源列表中下载源代码

    仿iphone滑动开关按钮实现

    总之,实现仿iPhone滑动开关按钮的关键在于理解其设计和交互原理,然后通过自定义View或利用现成的UI库来构建。在编程过程中,注意处理好图形绘制、触摸事件以及状态切换等核心逻辑,就能创建出与iPhone风格一致的...

    Iphone主界面时钟的立体旋转,按钮的拖动, 按钮的滑动等等特效

    在iOS开发中,创建引人入胜的用户体验是至关重要的,而Iphone主界面的时钟立体旋转、按钮拖动及滑动等特效正是提升应用吸引力的重要手段。这些特效不仅能够增强用户与应用的交互性,还能赋予界面活力,使整体设计...

    android上类似iphone上的开关按钮

    在Android平台上创建一个类似iPhone风格的开关按钮,可以为用户提供直观且一致的交互体验,特别是在设计跨平台应用时。这个主题涉及到UI设计、自定义视图以及事件处理等多个知识点。 首先,我们需要理解Android和...

    仿网易新闻漂亮美观的导航条及滑动效果

    本文将深入探讨如何实现"仿网易新闻漂亮美观的导航条及滑动效果"这一主题,主要关注移动应用开发,特别是针对iPhone平台。 首先,导航条(NavigationBar)是iOS应用中常见的一种组件,它位于屏幕顶部,通常包含应用...

    ToggleButton:仿Iphone的滑动开关按钮

    在Android开发中,为了提供与iOS设备类似的用户体验,开发者经常需要实现类似iPhone滑动开关的UI元素。这个“ToggleButton:仿Iphone的滑动开关按钮”项目就是针对这一需求的一个解决方案,它用Java语言实现了一个...

    android开发仿iphone开关按钮

    在Android开发中,为了实现与iPhone类似的开关按钮效果,我们需要深入了解和应用自定义视图、样式和动画等技术。以下是一些关键知识点的详细说明: 1. **自定义视图(Custom View)**: 在Android中,我们可以通过...

    基于jQuery的类似iphone的密码输入效果的实现代码.zip

    在这个案例中,"基于jQuery的类似iPhone的密码输入效果的实现代码.zip"提供了一种方法,让开发者能够为他们的网站添加一种模仿iPhone密码解锁界面的特效。这个压缩包包含了一个实现此功能的JavaScript库,可能是...

    SlipButtonDemo

    在“SlipButtonDemo”项目中,开发者设计并实现了一个高仿iPhone滑动按钮的功能,让用户可以在应用中体验到类似原生系统的感觉。下面将详细介绍这种滑动按钮的实现原理、设计思路以及可能的应用场景。 一、实现原理...

    android SwitchButton 滑动开关按钮

    本篇文章将详细探讨`SwitchButton`的使用、自定义以及实现与iPhone类似的效果。 ### 1. `Switch`组件介绍 `Switch`是Android提供的一个内置组件,它继承自`CompoundButton`,具有滑动和点击两种交互方式。默认情况...

    仿iPhone拍照快门效果.zip

    例如,可以定义一个从上到下或从左到右的渐变动画,应用到对应的元素上,使用户看到类似快门滑动的效果。CSS3的transform属性也可以用来缩放、旋转或移动元素,增强视觉效果。 在实际实现过程中,开发者需要考虑...

    jquery仿iphone向右划动删除行

    标题“jquery仿iphone向右划动删除行”指的是使用jQuery库来实现一种类似于iPhone应用中的交互效果,即当用户在移动Web环境下向右滑动表格行时,会显示出一个删除按钮,允许用户快速删除该行数据。这个功能常用于...

    仿IPhone菜单悬浮按钮

    在Android开发中,"仿IPhone菜单悬浮按钮"通常指的是实现类似于iOS系统中的Control Center的交互效果,即一个可以悬浮在屏幕边缘的按钮,点击后会展开一系列快捷操作的菜单。这种设计旨在提供用户便捷的访问常用功能...

    Wpf仿Iphone桌面翻页效果源码20130122

    核心特性是实现了类似iPhone的平滑翻页效果,用户可以通过点击或拖动来切换页面。这种效果为用户提供了直观且富有动态感的交互体验。当用户的操作不满足翻页条件时,程序会智能地回滚到当前页面,保持用户界面的稳定...

    android仿iphone DatePicker(字体适配) 滑动时间对话框

    在Android开发中,为了提供与iOS相似的用户体验,开发者经常需要实现类似iPhone的DatePicker组件。这个组件主要用于选择日期,通常以滑动的方式呈现年、月、日,具有良好的交互性。在Android原生的DatePicker控件...

    仿iphone效果,带源码

    1. **iOS风格界面设计**:iOS界面以其简洁、直观而闻名,主要特点包括圆角矩形按钮、半透明背景、动态效果等。仿iPhone效果通常包括但不限于以下元素: - 细节设计:如图标、字体、颜色搭配、阴影效果等,都需要与...

Global site tag (gtag.js) - Google Analytics