`
cwh643
  • 浏览: 127721 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

android上类似iphone上的开关按钮

 
阅读更多
public class SlipButton extends View {  
  
    private boolean nowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭  
    private boolean onSlip = false;//记录用户是否在滑动的变量  
    private float nowX;//按下时的x,当前的x
    private float downX;
    private float baseX;
    private OnChangedListener ChgLsn;  
    private Bitmap slip_btn; 
    private float centerX;
    
    private float yes_text_width;
    private float no_text_width;
    
    private int btnWdith;
    private String[] messages;
    
    private Paint paint;
      
    public SlipButton(Context context) {  
        super(context);   
        init();  
    }  
  
    public SlipButton(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        init();  
    }  
  
    private void init() { 
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLACK);
        paint.setTextSize(14);
        setMessages(new String[]{"Yes", "No"});
    }
    
    public void setButtonBitmap(Bitmap bitmap) {
    	if (bitmap == null) {
    		return;
    	}
    	slip_btn = bitmap;
        btnWdith = slip_btn.getWidth() / 3;
        centerX = btnWdith / 2;
    }
    
    public void setTextColor(int color) {
    	paint.setColor(color);
    }
    
    public void setTextSize(int size) {
    	paint.setTextSize(size);
    }
    
    public void setMessages(String[] messages) {
    	this.messages = messages;
    	yes_text_width = paint.measureText(messages[0]);
        no_text_width = paint.measureText(messages[1]);
    }
    
    public void setStatusOn(boolean on) {
    	nowChoose = on;
    }
    
    public boolean getStatusOn() {
    	return nowChoose;
    }
    
    public void setOnChangedListener(OnChangedListener l) {
        ChgLsn = l;  
    }
      
    @Override  
    protected void onDraw(Canvas canvas) { 
        super.onDraw(canvas);
        if (slip_btn == null) {
    		return;
    	}
        
        float minX = centerX;
        float maxX = getMeasuredWidth() - centerX;
        
        if (onSlip) {
        	nowX = baseX - (downX - nowX);
        	nowX = Math.min(Math.max(minX, nowX), maxX);
        } else {
        	if (nowChoose) {
        		nowX = maxX;
        	} else {
        		nowX = minX;
        	}
        	baseX = nowX;
        }
	    canvas.drawBitmap(slip_btn, nowX - centerX - btnWdith, 0, paint);//画出游标.
	   
        int marginX1 = (int)(btnWdith - yes_text_width) / 2;
        canvas.drawText(messages[0], nowX - centerX - marginX1 - yes_text_width, 22, paint);
	    
        int marginX2 = (int)(btnWdith - no_text_width) / 2;
        canvas.drawText(messages[1], nowX + centerX + marginX2, 22, paint);
    }  
  
  
    @Override
	public boolean onTouchEvent(MotionEvent event) {
    	if (slip_btn == null) {
    		return false;
    	}
    	
        switch(event.getAction())//根据动作来执行代码  
        {  
        case MotionEvent.ACTION_MOVE://滑动 
        	nowX = event.getX();
        	float moveX = downX - nowX;
        	if (Math.abs(moveX) > 5) {
        		onSlip = true;
        	}
            break;  
        case MotionEvent.ACTION_DOWN://按下  
        	downX = event.getX();
            break;  
        case MotionEvent.ACTION_UP://松开  
        	boolean LastChoose = nowChoose;
        	if (onSlip) {
        		moveX = downX - event.getX();
        		if (nowChoose) {
        			if ((moveX > 0) && (moveX >= centerX))
        				nowChoose = !nowChoose;
        		} else {
        			if ((moveX < 0) && (Math.abs(moveX) >= centerX))
        				nowChoose = !nowChoose;
        		} 
        	} else {
        		nowChoose = !nowChoose;
        	}
            onSlip = false;
            if ((ChgLsn != null) && (LastChoose != nowChoose)) {
            	if (nowChoose) {
            		ChgLsn.onChanged(nowChoose, messages[0]);
            	} else {
            		ChgLsn.onChanged(nowChoose, messages[1]);
            	}
            }
            break;  
        default:
        	break; 
        }  
        invalidate();//重画控件  
        return true;
	}
    
    public interface OnChangedListener {
    	public void onChanged(boolean on, String value);
    }
}
0
1
分享到:
评论

相关推荐

    android开发仿iphone开关按钮

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

    android 拖动类似Iphone AssistiveTouch的快捷键按钮

    在Android平台上,实现类似iPhone的AssistiveTouch功能,可以为用户提供便捷的触控操作,类似于浮动菜单,方便用户快速访问常用功能。这个功能通常包括屏幕截图、返回、主页、多任务等操作,而且可以自定义设置。在...

    类似iphone滑动按钮效果

    标题中的“类似iPhone滑动按钮效果”指的是在iOS或Android应用开发中常见的滑动开关(Slide Button)组件,这种组件通常被用作一种用户界面元素,允许用户通过滑动按钮来开启或关闭某个功能。在iOS中,它被称为...

    Android中仿iphone开关按钮SwitchButton的基本使用

    Android中仿iphone开关按钮SwitchButton的基本使用,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/60480014

    Android自定义Iphone风格的圆角边框开关按钮

    在Android开发中,为了提供与iOS系统相似的用户体验,开发者经常需要自定义UI元素,比如Iphone风格的圆角边框开关按钮。本教程将详细讲解如何在Android中使用XML来实现这一功能,无需依赖任何图片资源。 首先,我们...

    Android 仿 Iphone 滑动按钮(SlipButton)

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

    Android 仿 iPhone 自定义滑动按钮

    本教程将详细讲解如何在Android中仿制iPhone的滑动开关按钮,让应用程序看起来更加原生且用户友好。 首先,我们需要了解滑动按钮的基本构成。iPhone的滑动按钮通常由两部分组成:一个背景和一个可滑动的滑块。背景...

    android SwitchButton 滑动开关按钮

    在提供的`TestSwitchBtn`文件中,我们可以看到一个实际的自定义`SwitchButton`示例,通过查看和分析这个文件,可以学习到如何实现一个与iPhone相似的滑动开关按钮。具体实现细节可能包括XML布局文件的调整、自定义...

    仿iphone滑动开关按钮实现

    本教程将深入探讨如何在非iOS系统中模仿iPhone的滑动开关按钮的实现。 首先,我们需要理解滑动开关的基本组成和工作原理。滑动开关通常由两个主要部分构成:开关背景和滑块。当用户触摸并滑动滑块时,滑块会在背景...

    android桌面悬浮按钮

    在描述中提到的“仿iphone的 touch助手”,指的是类似iOS的小白点辅助工具,这种功能在Android中可以通过悬浮按钮实现,提供快速访问各种快捷操作的入口。 对于“拖动”和“移动”这两个标签,它们与`...

    android滑动按钮源代码

    在Android开发中,滑动按钮(Sliding Button)是一种常见的交互元素,它提供了一种直观且有趣的方式来切换开关状态或执行特定操作。本资源提供的"android滑动按钮源代码"显然是一个模仿iPhone设计的实现,旨在为...

    防iphone的switch按钮

    在Android开发中,为了提供与iOS系统相似的用户体验,开发者有时会希望实现一款仿照iPhone样式设计的开关按钮,即“Switch按钮”。本教程将详细讲解如何在Android中创建一个美观且功能齐全的仿iPhone风格的Switch...

    preference方式实现的仿iPhone开关

    "preference方式实现的仿iPhone开关"是指使用Android中的Preference机制来创建一个类似iPhone风格的开关控件。这种开关通常用于切换应用的某个功能状态,如开启或关闭通知、同步等。 Preference在Android中主要用于...

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

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

    Axure Android、iPhone部件库打包

    1. iPhone部件:这些部件通常会模拟iOS设备上的原生控件,如苹果的导航栏、标签页栏、滑动选择器、开关按钮、输入框、日期选择器等。它们严格按照Apple的人机交互指南(Human Interface Guidelines,HIG)设计,确保...

    ToggleButton:仿Iphone的滑动开关按钮

    这个“ToggleButton:仿Iphone的滑动开关按钮”项目就是针对这一需求的一个解决方案,它用Java语言实现了一个自定义的ToggleButton,旨在模仿iOS中的滑动开关样式和交互效果。 首先,我们来看一下滑动开关的基本概念...

    android switchButton

    在标题“android switchButton”中,提到的是对这种特定UI元素的实现或优化,尤其是为了模仿iPhone上的开关效果。 描述中提到的几个关键特性: 1. **点击自动滚动**:这可能是指当用户点击开关时,开关会立即滚动...

    android高仿iphne开关

    有时候我们在Android开发的时候需要iphone中的设置按钮,这个时候只能重写checkbox来自定义了,详细请看:http://blog.csdn.net/dawanganban/article/details/19081773

    最新实用Axure手机组件库大全(Iphone5及Android)

    "最新实用Axure手机组件库大全(Iphone5及Android)"是一个专门针对移动设备设计的资源集合,包含了适用于iPhone 5和Android 4.0系统的全面组件。 该组件库的重要性在于它能够极大地提高设计师的工作效率,减少从零...

Global site tag (gtag.js) - Google Analytics