- 浏览: 1220585 次
- 性别:
- 来自: 荆州
文章分类
- 全部博客 (396)
- Android 基础 (72)
- Java 基础 (42)
- Android(动画效果) (26)
- Android(自定义组件) (13)
- Android(手机服务) (38)
- Android(网络相关) (27)
- Android(多媒体) (12)
- Android(小技巧) (30)
- Android(用户界面) (39)
- 基础概念 (24)
- Android组件学习 (21)
- Android数据库相关 (11)
- 生活杂谈 (10)
- 调试技巧部分 (8)
- Sql Server相关 (1)
- Android(xml相关) (2)
- Android 开发 (12)
- 韩语学习 (4)
- Mac添加环境变量的三种方法 (1)
- iPhone开发 (1)
- Android Studio (1)
最新评论
-
ppfbsar:
下载网络文件到SD卡上 -
851228082:
好文!彻底理解单类型导入与按需导入的区别了。还有一点可以通过 ...
谈java的导入(import) -
麦田的设计者:
老乡啊
sqlite 数据库保存图片 -
sf_dream:
我要是读写list、map之类的集合呢
ObjectOutputStream和ObjectInputStream类的学习 -
xfyunyun:
博主,请问webview加载html字符串时怎么进行缓存处理呢 ...
WebView使用总结2(加载HTML内容形式的String)
先上一张效果图:
以后大家在设计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>
本来不想附上源码的,因为代码都贴在这了,还是附上吧,也许有的人需要现成的东东!!!!
评论
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.
发一下出来。
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; 这个又代表哪种状态啊?
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个浏览,居然没人回复,我来谢谢你啦~
发表评论
-
Android Studio一些使用快捷键
2016-12-17 10:17 68311.command+delete 删除一行代码 2.co ... -
Freeline快速集成
2016-11-11 16:30 78771. Freeline是什么? Freelin ... -
android:installLocation简析
2016-10-08 16:42 6606在Froyo(android 2.2,API Level:8) ... -
防止Service被系统轻易回收
2013-11-09 17:14 7640最近在使用android 4.1系统的时候,发现在手机休眠一段 ... -
手机浏览器打开应用或应用市场
2013-10-17 14:54 2081当在项目中出现下列情形: 应用开发商想对手机注册用 ... -
ListView显示不同布局(模拟ExpandListView)
2013-09-12 15:05 5976public class MainActivity ext ... -
多点触控之MotionEvent.ACTION_MASK作用
2013-07-23 14:49 2082ACTION_MASK在Android中是应用于多点触摸操作, ... -
Using Ant to Automate Building Android Applications
2013-05-23 13:32 2115Using Ant to Automate Building ... -
Android Bitmap getByteCount和getRowBytes
2013-05-03 11:16 2457Bitmap关于内存占用的API 1、getRowB ... -
音频功能实现
2013-04-25 14:49 11951.音频PCM转SPX格式:http://blog.csdn. ... -
MAC下Android的Eclipse开发环境的搭建
2013-04-20 09:42 1170一.Eclipse的下载 ... -
屏幕点亮和关闭广播监听
2013-04-07 21:49 2651private void registerScreenActi ... -
mac上配置adb
2013-04-06 17:50 1358问:为什么要配置ADB ? 答:不配置的话,每次用到ADB都要 ... -
Notification用法复习(3.0以后版本)
2012-11-04 11:33 3205使用Notification的示例代码: public c ... -
Android应用icon图标
2012-07-07 15:02 1605对于Android平台来说,不同分辨率下Icon的大小设计有着 ... -
Android软键盘控制
2012-05-12 17:08 9303整个输入法框架(IMF)结构的核心API,应用程序之间进行调度 ... -
键盘自动弹出
2012-04-25 17:28 1117Timer timer = new Timer(); ... -
Eclipse 默认打开Android xml 布局
2012-04-21 17:02 2119今天新装了Android开发环境后,新建一个工程,打开xml发 ... -
苹果开发android 第一步
2012-04-14 22:50 1253今天开始,准备使用mac来进行android开发,将开发中遇到 ... -
SpannableStringBuilder的简单用法
2012-02-29 14:29 2409一段代码,贴了自己以后看: TextView mText ...
相关推荐
"自定义SlipButton和高仿iPhone滑动按钮"就是一个这样的实践,它旨在为Android应用添加一个模仿iPhone滑动开关的组件。这个组件通常被称为滑动开关(Switch)或滑动选择器(Slider),它允许用户通过简单的滑动动作...
在Android开发中,为了提供与iOS设备类似的用户体验,开发者经常需要实现特定的UI元素,例如Iphone上的滑动按钮(SlipButton)。本教程将详细讲解如何在Android中创建一个仿照iPhone风格的滑动按钮,并探讨其核心原理...
通过以上步骤,我们便可以在Android应用中实现一个类似iPhone的滑动按钮。这种自定义组件不仅可以提高应用的视觉一致性,还能增强用户体验。需要注意的是,在实际开发中,还需要考虑滑动按钮的触碰区域、滑动阻力等...
Android仿iphone滑动解锁,此为APK,如果觉得效果不错,可以在我的资源列表中下载源代码
总之,实现仿iPhone滑动开关按钮的关键在于理解其设计和交互原理,然后通过自定义View或利用现成的UI库来构建。在编程过程中,注意处理好图形绘制、触摸事件以及状态切换等核心逻辑,就能创建出与iPhone风格一致的...
在iOS开发中,创建引人入胜的用户体验是至关重要的,而Iphone主界面的时钟立体旋转、按钮拖动及滑动等特效正是提升应用吸引力的重要手段。这些特效不仅能够增强用户与应用的交互性,还能赋予界面活力,使整体设计...
在Android平台上创建一个类似iPhone风格的开关按钮,可以为用户提供直观且一致的交互体验,特别是在设计跨平台应用时。这个主题涉及到UI设计、自定义视图以及事件处理等多个知识点。 首先,我们需要理解Android和...
本文将深入探讨如何实现"仿网易新闻漂亮美观的导航条及滑动效果"这一主题,主要关注移动应用开发,特别是针对iPhone平台。 首先,导航条(NavigationBar)是iOS应用中常见的一种组件,它位于屏幕顶部,通常包含应用...
在Android开发中,为了提供与iOS设备类似的用户体验,开发者经常需要实现类似iPhone滑动开关的UI元素。这个“ToggleButton:仿Iphone的滑动开关按钮”项目就是针对这一需求的一个解决方案,它用Java语言实现了一个...
在Android开发中,为了实现与iPhone类似的开关按钮效果,我们需要深入了解和应用自定义视图、样式和动画等技术。以下是一些关键知识点的详细说明: 1. **自定义视图(Custom View)**: 在Android中,我们可以通过...
在这个案例中,"基于jQuery的类似iPhone的密码输入效果的实现代码.zip"提供了一种方法,让开发者能够为他们的网站添加一种模仿iPhone密码解锁界面的特效。这个压缩包包含了一个实现此功能的JavaScript库,可能是...
在“SlipButtonDemo”项目中,开发者设计并实现了一个高仿iPhone滑动按钮的功能,让用户可以在应用中体验到类似原生系统的感觉。下面将详细介绍这种滑动按钮的实现原理、设计思路以及可能的应用场景。 一、实现原理...
本篇文章将详细探讨`SwitchButton`的使用、自定义以及实现与iPhone类似的效果。 ### 1. `Switch`组件介绍 `Switch`是Android提供的一个内置组件,它继承自`CompoundButton`,具有滑动和点击两种交互方式。默认情况...
例如,可以定义一个从上到下或从左到右的渐变动画,应用到对应的元素上,使用户看到类似快门滑动的效果。CSS3的transform属性也可以用来缩放、旋转或移动元素,增强视觉效果。 在实际实现过程中,开发者需要考虑...
标题“jquery仿iphone向右划动删除行”指的是使用jQuery库来实现一种类似于iPhone应用中的交互效果,即当用户在移动Web环境下向右滑动表格行时,会显示出一个删除按钮,允许用户快速删除该行数据。这个功能常用于...
在Android开发中,"仿IPhone菜单悬浮按钮"通常指的是实现类似于iOS系统中的Control Center的交互效果,即一个可以悬浮在屏幕边缘的按钮,点击后会展开一系列快捷操作的菜单。这种设计旨在提供用户便捷的访问常用功能...
核心特性是实现了类似iPhone的平滑翻页效果,用户可以通过点击或拖动来切换页面。这种效果为用户提供了直观且富有动态感的交互体验。当用户的操作不满足翻页条件时,程序会智能地回滚到当前页面,保持用户界面的稳定...
在Android开发中,为了提供与iOS相似的用户体验,开发者经常需要实现类似iPhone的DatePicker组件。这个组件主要用于选择日期,通常以滑动的方式呈现年、月、日,具有良好的交互性。在Android原生的DatePicker控件...
1. **iOS风格界面设计**:iOS界面以其简洁、直观而闻名,主要特点包括圆角矩形按钮、半透明背景、动态效果等。仿iPhone效果通常包括但不限于以下元素: - 细节设计:如图标、字体、颜色搭配、阴影效果等,都需要与...