zoukankan      html  css  js  c++  java
  • android 拖动按钮

    引用:http://blog.sina.com.cn/s/blog_80723de80100vqln.html

    首先效果图:


    然后是分别建立三个文件,第一个是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 {  
          
        @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(...);


    本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-09/43213.htm

  • 相关阅读:
    约束布局ConstraintLayout看这一篇就够了
    1-9 最长连续递增子序列 (20 分)
    1-8 数组循环左移 (20 分)
    1-6 求链式线性表的倒数第K项 (20 分)
    CMD命令集(转自脚本之家)
    网卡、网关
    PHP Callable强制指定回调类型的方法
    PHP常用魔术方法(__invoke魔术方法)
    php 通过 yield 实现协程有什么使用场景
    PHP的yield是个什么玩意
  • 原文地址:https://www.cnblogs.com/sode/p/2622913.html
Copyright © 2011-2022 走看看