Android编程实现滑动按钮功能详解

本文实例讲述了Android编程实现滑动按钮功能。分享给大家供大家参考,具体如下:

首先效果图:

然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.class

main.class

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class Main extends Activity implements OnChangedListener {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);//获得指定控件
    myBtn.SetOnChangedListener(this);//为控件设置监听器
  }
    @Override
    public void OnChanged(boolean CheckState) {//当按钮状态被改变时
    // TODO Auto-generated method stub
    if(CheckState)
      Toast.makeText(this,"打开了..." , Toast.LENGTH_SHORT).show();
    else
      Toast.makeText(this,"关闭了..." , Toast.LENGTH_SHORT).show();
  }
}

SlipButton.class

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class SlipButton extends View implements OnTouchListener{
  private boolean NowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭
  private boolean OnSlip = false;//记录用户是否在滑动的变量
  private float DownX,NowX;//按下时的x,当前的x,
  private Rect Btn_On,Btn_Off;//打开和关闭状态下,游标的Rect
  private boolean isChgLsnOn = false;
  private OnChangedListener ChgLsn;
  private Bitmap bg_on,bg_off,slip_btn;
  public SlipButton(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    init();
  }
  public SlipButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    init();
  }
  private void init(){//初始化
    //载入图片资源
    bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_on);
    bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_off);
    slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.slip_btn);
    //获得需要的Rect数据
    Btn_On = new Rect(0,0,slip_btn.getWidth(),slip_btn.getHeight());
    Btn_Off = new Rect(
        bg_off.getWidth()-slip_btn.getWidth(),
        0,
        bg_off.getWidth(),
        slip_btn.getHeight());
    setOnTouchListener(this);//设置监听器,也可以直接复写OnTouchEvent
  }
  @Override
  protected void onDraw(Canvas canvas) {//绘图函数
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    Matrix matrix = new Matrix();
    Paint paint = new Paint();
    float x;
    {
      if(NowX<(bg_on.getWidth()/2))//滑动到前半段与后半段的背景不同,在此做判断
        canvas.drawBitmap(bg_off,matrix, paint);//画出关闭时的背景
      else
        canvas.drawBitmap(bg_on,matrix, paint);//画出打开时的背景
      if(OnSlip)//是否是在滑动状态,
      {
        if(NowX >= bg_on.getWidth())//是否划出指定范围,不能让游标跑到外头,必须做这个判断
          x = bg_on.getWidth()-slip_btn.getWidth()/2;//减去游标1/2的长度...
        else
          x = NowX - slip_btn.getWidth()/2;
      }else{//非滑动状态
        if(NowChoose)//根据现在的开关状态设置画游标的位置
          x = Btn_Off.left;
        else
          x = Btn_On.left;
      }
    if(x<0)//对游标位置进行异常判断...
      x = 0;
    else if(x>bg_on.getWidth()-slip_btn.getWidth())
      x = bg_on.getWidth()-slip_btn.getWidth();
    canvas.drawBitmap(slip_btn,x, 0, paint);//画出游标.
    }
  }
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    switch(event.getAction())//根据动作来执行代码
    {
    case MotionEvent.ACTION_MOVE://滑动
      NowX = event.getX();
      break;
    case MotionEvent.ACTION_DOWN://按下
    if(event.getX()>bg_on.getWidth()||event.getY()>bg_on.getHeight())
   return false;
      OnSlip = true;
      DownX = event.getX();
      NowX = DownX;
      break;
    case MotionEvent.ACTION_UP://松开
      OnSlip = false;
      boolean LastChoose = NowChoose;
      if(event.getX()>=(bg_on.getWidth()/2))
        NowChoose = true;
      else
        NowChoose = false;
      if(isChgLsnOn&&(LastChoose!=NowChoose))//如果设置了监听器,就调用其方法..
        ChgLsn.OnChanged(NowChoose);
      break;
    default:
    }
    invalidate();//重画控件
    return true;
  }
  public void SetOnChangedListener(OnChangedListener l){//设置监听器,当状态修改的时候
    isChgLsnOn = true;
    ChgLsn = l;
  }
}

onchangeListener.class

package CMD100.demo.slipButton;
public interface OnChangedListener {
  abstract void OnChanged(boolean CheckState);
}

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"
  >
<TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/hello"
  />
<LinearLayout
  android:orientation = "horizontal"
  android:layout_width = "fill_parent"
  android:layout_height = "wrap_content"
  android:background = "#ff0000"
  >
  <TextView
    android:text = "测试:"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    />
 <CMD100.demo.slipButton.SlipButton
    android:id = "@+id/slipBtn"
    android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginLeft = "10sp"
  />
</LinearLayout>
</LinearLayout>

注意:在xml里头要放置的位置

<[包名].SlipButton
  android:id = "@+id/slipBtn"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  />

然后可以像其他控件一样使用了...

SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);
myBtn.SetOnChangedListener(...);

代码到这里就全部完成了。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android按钮单击事件的四种常用写法总结

    很多学习Android程序设计的人都会发现每个人对代码的写法都有不同的偏好,比较明显的就是对控件响应事件的写法的不同.因此本文就把这些写法总结一下,比较下各种写法的优劣,希望对大家灵活地选择编码方式可以有一定的参考借鉴价值. xml文件代码如下: <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_conte

  • 如何在Android中实现左右滑动的指引效果

    本文的目的是要实现左右滑动的指引效果.那么什么是指引效果呢?现在的应用为了有更好的用户体验,一般会在应用开始显示一些指引帮助页面,使用户能更好的理解应用的功能,甚至是一些新闻阅读器会把一些头条新闻以指引效果的形式显示.说个最基本的,就是我们的手机主屏幕就是这种效果. 下面我们就开始实现我们的左右滑动指引效果.为了大家更好的理解,我们先看下实现效果,如下图所示:     在这里,我们需要用到google提到的一个包--android-support-v4.jar,这个包包含了一些非常有用的类,其中

  • Android中实现水平滑动(横向滑动)ListView示例

    水平的ListView-HorizontalListView的使用 Android中ListView默认的是竖直方向的滑动,由于项目的需求,需要ListView是水平滑动的.有很多的方式可以实现,但是比较好的一种方式就是自己封装一个控件,使用方式和ListView的使用方式是一样的.需要完善的地方:获取到的图片大小没有处理.在界面上展示的是图片的原大小.为了更好的展示效果,应该压缩成统一的尺寸. HorizontalListView.java 代码如下: /** * 横向的ListView *

  • Android仿今日头条滑动页面导航效果

    最近项目中用到了滑动页面,也就是和目前市场上很火的"今日头条"页面滑动类似,在网上找了一下,大部分都是用ViewPager来实现的,刚开始我用的是ViewPager+ViewGroup,上面的标题按钮用的是HorizontalScrollView,写完之后感觉效果比较生硬,果断换掉,发现了一个效果比较好的第三方,也就是今天的主题:PagerSlidingTabStrip.好了,下面来具体介绍一下PagerSlidingTabStrip,进行一下源码解析. 一.看一下demo的样子吧 二

  • Android实现左右滑动效果的方法详解

    本示例演示在Android中实现图片左右滑动效果. 关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来就让我们开始实现这种效果.为了方便大家理解,我们先来看一下效果图:主要效果图如下图:    接下来我们看一下程序结构图: MainActivity文件中代码: 复制代码 代码如下: package com.android.flip;import android.app.Activity;import a

  • Android基于ImageView绘制的开关按钮效果示例

    本文实例讲述了Android基于ImageView绘制的开关按钮效果.分享给大家供大家参考,具体如下: 今天弄了一下用图片绘制开关按钮. 效果图: 还有我两张start图片和stop图片就是上面的图片,到时候大家可以按照自己的图片调用.. Main.xml文件 在xml进入这段代码就ok了. <ImageView Android:id="@+id/start" android:layout_width="150.px" android:layout_heigh

  • android中使用Activity实现监听手指上下左右滑动

    用Activity的onTouchEvent方法实现监听手指上下左右滑动 应用了Activity的ontouchEvent方法监听手指点击事件,手指滑动的时候会先按下,滑倒另一个地方再抬起,我们就可以根据按下的坐标和抬起的坐标算出用户是往哪一个方向滑动了. package com.example.testtt; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; impor

  • Android编程实现简单设置按钮颜色的方法

    本文实例讲述了Android编程实现简单设置按钮颜色的方法.分享给大家供大家参考,具体如下: 1.工程目录 a.在res目录-新建drawble文件夹放入自定义图片 2.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android" android:or

  • 自定义滑动按钮为例图文剖析Android自定义View绘制

    自定义View一直是横在Android开发者面前的一道坎. 一.View和ViewGroup的关系 从View和ViewGroup的关系来看,ViewGroup继承View. View的子类,多是功能型的控件,提供绘制的样式,比如imageView,TextView等,而ViewGroup的子类,多用于管理控件的大小,位置,如LinearLayout,RelativeLayout等,从下图可以看出 从实际应用中看,他们又是组合关系,我们在布局中,常常是一个ViewGroup嵌套多个ViewGro

  • Android中实现监听ScrollView滑动事件

    时候我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部.可惜的是SDK并没有相应的方法,不过倒是提供了一个 复制代码 代码如下: protected void onScrollChanged(int x, int y, int oldx, int oldy) 方法,显然这个方法是不能被外界调用的,因此就需要把它暴露出去,方便使用.解决方式就是写一个接口, 复制代码 代码如下: package com.example.demo1;    public inter

  • Android编程之滑动按钮事件实例详解

    本文实例讲述了Android滑动按钮事件.分享给大家供大家参考,具体如下: 今天纪录一下滑动按钮功能.. 首先效果图: 然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.class main.class import Android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class Main e

  • 如何在Android中实现渐显按钮的左右滑动效果

    先看下运行效果:    程序结构: MainActivity文件中代码: 复制代码 代码如下: package com.android.buttonpageflipper;import android.app.Activity;import android.graphics.PixelFormat;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Gra

  • android 左右滑动+索引图标实现方法与代码

    使用Gallery和ImageView实现android左右滑动+索引图标效果. 首先自定义Gallery实现一次只能滑动一个页面 复制代码 代码如下: public class MGalleryView extends Gallery{ public MGalleryView(Context context, AttributeSet attrs) { super(context, attrs); } //一次只能滑动一张图片注:一张图充满全屏 @Override public boolean

随机推荐