自定义开关控件

           大家好,今天给大家分享的是自定义控件开关,这在自定义控件中是个非常重要的知识点,所以我把它作为例子给大家讲解,加深对自定义控件的认识,在开发中,很常涉及到要自己自定义控件,这必然要引起大家极其的关注。

创建MySwitch继承View,实现自定义


public class MySwitch extends View {
 private Bitmap mBitmapBg;//图片背景
 private Bitmap mBitmap;//移动图片
 private int max_left;//最大边距
 private int mSigleBitmap;//滑动的变量
 private boolean isOpean;//判断是打开还是关闭状态
 private onCheckChangeListenter mListener;//回调监听
 private int startX;
 private int endX;
 boolean isClick;//判断是点击还是触摸
 int moveX;.//移动的总距离,根据移动的距离,判断是点击事件还是触摸事件

//构造方法

 public MySwitch(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  initView();// 初始化组件
 }

 public MySwitch(Context context, AttributeSet attrs) {
  super(context, attrs);
  initView();// 初始化组件
 }

 public MySwitch(Context context) {
  super(context);
  initView();// 初始化组件
 }

 // 初始化组件
 private void initView() {
  //获取图片,使用BitmapFactory.decodeResource获取
  mBitmapBg = BitmapFactory.decodeResource(getResources(),
    R.drawable.switch_background);
  mBitmap = BitmapFactory.decodeResource(getResources(),
    R.drawable.slide_button);
  //得到最大边距
  max_left = mBitmapBg.getWidth() - mBitmap.getWidth();

 //控件的点击事件,点击的是滑块
  setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    //当是点击事件执行这方法
    if (isClick) {

     //如果是打开状态
     if (isOpean) {

//滑动变量为0,状态改变
      mSigleBitmap = 0;
      isOpean = false;
     //如果是关闭状态
     } else {

//滑动变量为最大左边距,状态改变
      mSigleBitmap = max_left;
      isOpean = true;
     }
     //刷新数据
     invalidate();

    //3.点击开始回调,回调相关数据
     if (mListener != null) {
      mListener.onCheckChange(MySwitch.this, isOpean);
     }
    }
   }
  });

 }

 //测量,设置控件的大小
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  // super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  //设置是以背景的长宽作为控件的大小
  setMeasuredDimension(mBitmapBg.getWidth(), mBitmapBg.getHeight());
 }

 /**
  * 1.定义回调函数接口
  */

 public interface onCheckChangeListenter {
  public void onCheckChange(View view, boolean isCheck);
 }

 /**
  * 2.暴露方法,回调监听,构造方法
  *
  */
 public void setOnCheckChangeListenter(onCheckChangeListenter listenter) {
  this.mListener = listenter;
 }

 //触摸事件
 public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
   //刚开始按下的坐标x
   startX = (int) event.getX();

   break;
  case MotionEvent.ACTION_MOVE:
   //移动时坐标x,也就是最后点击的坐标x
   endX = (int) event.getX();
   //计算滑动的偏移量
   int dx = endX - startX;
   //根据偏移量更新划片的位置
   mSigleBitmap = mSigleBitmap + dx;
   //移动的总距离,绝对值,可能有负数
   moveX = Math.abs(moveX + dx);

   //判断不能越界
   if (mSigleBitmap < 0) {
    mSigleBitmap = 0;
   }

   if (mSigleBitmap > max_left) {
    mSigleBitmap = max_left;
   }
   // 刷新页面
   invalidate();

  //重新获取起始点
   startX = (int) event.getX();

   break;

  case MotionEvent.ACTION_UP:

   //移动总距离大于5,则是触摸事件
   if (moveX > 5) {
    isClick = false;
    //反之,则是点击事件
   } else {
    isClick = true;
   }
   //清除总移动值
   moveX = 0;

   //当是触摸事件时,
   if (!isClick) {

    //判断滑动的变量与最大左边距对比,
    if (mSigleBitmap < max_left / 2) {
     mSigleBitmap = 0;
     isOpean = false;
    } else {
     mSigleBitmap = max_left;
     isOpean = true;
    }

    // 刷新页面
    invalidate();

    //触摸事件的回调方法,回调相关的数据
    if (mListener != null) {
     mListener.onCheckChange(MySwitch.this, isOpean);
    }
   }
   break;

  default:
   break;
  }

  return super.onTouchEvent(event);
 }

//在自定义控件执行的方法:onMeasure-->onLayout--->onDraw
 protected void onDraw(Canvas canvas) {
  //绘制图片
  canvas.drawBitmap(mBitmapBg, 0, 0, null);
 //绘制滑块图片,参数二:变量
  canvas.drawBitmap(mBitmap, mSigleBitmap, 0, null);

 }

}

MainActivity.java实现监听事件

public class MainActivity extends Activity {
private MySwitch mMySwitch;//自定义控件
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMySwitch=(MySwitch) findViewById(R.id.div_myswitch);
        
        //调用回调函数,因为是自定义控件本身是没有属性方法的,需要创建,然后回调,不像,本身自带的控件有属于自己的方法
        mMySwitch.setOnCheckChangeListenter(new onCheckChangeListenter() {
   
   @Override
   public void onCheckChange(View view, boolean isCheck) {
                Toast.makeText(MainActivity.this, "开关状态::"+isCheck, 2000).show();    
   }
  });
        
  
今晚的自定义开关控件就到这里,相信大家看完之后能有所收获。晚安


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着人口老龄化和空巢化等社会问题的日益严峻,养老问题及以及养老方式的变革成为了当前社会的发展焦点,传统的养老模式以救助型和独立型为主,社会养老的服务质量与老年人的养老需求还存在一定的差距,人们生活水平的提高以及养老多元化需求的增加都需要通过创新和灵活开放的养老模式来应对未来的养老需求,结合目前我国养老模式及养老服务问题的内容的分析,互助养老模式作为一种新型的养老模式结合自主互助的集体养老理念,帮助老年人实现了满足个性需求的养老方案,互助养老模式让老年人具备了双重角色的同时也实现可持续的发展特色。目前我国老年人的占比以每年5%的速度在飞速增长,养老问题及养老服务的提供已经无法满足当前社会养老的切实需求,在养老服务质量和养老产品的变革过程中需要集合多元化的养老模式来满足更多老人的养老需求。 鉴于我国目前人口老龄化的现状以及迅速扩张的养老服务需求,现有的养老模式已经无法应对和满足社会发展的需求,快速增长的养老人员以及养老服务供给不足造成了紧张的社会关系,本文结合当前养老服务的发展需求,利用SSM框架以及JSP技术开发设计一款正对在线互助养老的系统,通过系统平台实现养老机构信息的传递及线上预约,搭建了起了用户、养老机构以及系统管理员的三方数据平台,借助网页端实现在线的养老互助信息查询、养老机构在线预约以及求助需求等功能,通过自养互养的养老模式来帮助老年人重新发现自我价值以及丰富养老的主观能动性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值