打造属于你的炫酷按钮,自定义滑动按钮【永利澳门游戏网站】

<pre><code>@Override protected void onDraw(Canvas canvas) {
super.onDraw; height = getMeasuredHeight(); width = getMeasuredWidth();
Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
//计算文字高度 float fontHeight = fontMetrics.bottom – fontMetrics.top;
//计算文字baseline float textBaseY = height – (height – fontHeight) / 2

import android.content.Context;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Color;
import android.graphics.Matrix;  
import android.graphics.Paint;  
import android.util.AttributeSet;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.View.OnTouchListener;

先要说下onDraw方法,View中最主要的三个方法是OnMeasure()测量大小,onDraw()画,onLayout()排放位置。像TextView和Button都是在onDraw里面绘制的。在最初我们就初始化了一个画笔,那么画笔有了接一下我们还缺什么?对,就是画布,Canvas也就是我们的画布,同Paint这里我只说一下我们用到的方法,其他方法我会在以后的文章中详细介绍。

  第一接触公司项目就让我画页面,而且还涉及到我最讨厌的自定义view 
但是没办法,讨厌也必须要做啊,经过百度上资源的查找,终于写出了一个滑动控件。废话不多说,上代码。

下面我们要确定圆心,也就是从哪里开始画圆,圆心是我们用手点击的位置不固定,所以我们要重写onInterceptTouchEvent和onTouchEvent来获取点击的位置,我们还要考虑点击的位置是否是有效的,isValidClick就是用来判断是否有效,思路是在控件的宽高之内,之外我们就算无效点击。如果是有效事件,那我们就把触摸的位置记录下来,然后改变我们的状态,接下来呢就是发送Handler,在Handler里面我们重绘按钮,并每次都递增圆的半径。

 

<pre><code>private void init(Context context) { this.context
= context; textPaint = new Paint();
textPaint.setAntiAlias;textPaint.setStyle(Paint.Style.STROKE);
textPaint.setColor(Color.parseColor(“#ECFAF2”));
textPaint.setTextAlign(Paint.Align.CENTER); textPaint.setTextSize;
textPaint.setTypeface(Typeface.DEFAULT_BOLD); bgPaint = new Paint();
bgPaint.setAntiAlias; bgPaint.setStyle(Paint.Style.FILL);
bgPaint.setColor(Color.parseColor(“#B7B7B7”));
}</code></pre>

 

代码如下:

import com.etong.cpms.activity.R;

赶快去打造你自己的炫酷按View吧!

版权声明:本文为博主原创文章,未经博主允许不得转载。

public class WiperSwitch extends View implements OnTouchListener{  
    private Bitmap bg_on, bg_off, slipper_btn;  
    private String mOnText = “打开”;
    private String mOffText = “关闭”;
    /**
     * 按下时的x和当前的x
     */  
    private float downX, nowX;  
      
    /**
     * 记录用户是否在滑动
     */  
    private boolean onSlip = false;  
      
    /**
     * 当前的状态
     */  
    private boolean nowStatus = false;  
      
    /**
     * 监听接口
     */  
    private OnChangedListener listener;  
      
      
    public WiperSwitch(Context context) {  
        super(context);  
        init();  
    }  
 
    public WiperSwitch(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        init();  
    }  
      
    public void init(){  
        //载入图片资源  
        bg_on = BitmapFactory.decodeResource(getResources(),
R.drawable.switch_bkg_switch1);  
        bg_off = BitmapFactory.decodeResource(getResources(),
R.drawable.switch_bkg_switch1);  
        slipper_btn = BitmapFactory.decodeResource(getResources(),
R.drawable.switch_btn_slip1);  
        setOnTouchListener(this);  
    }  
      
    protected void onDraw(Canvas canvas) {  
        super.onDraw(canvas);  
        Matrix matrix = new Matrix();  
        Paint paint = new Paint();  
        float x = 0;  
          
        //根据nowX设置背景,开或者关状态  
        if (nowX < (bg_on.getWidth()/2)){  
              canvas.drawBitmap(bg_off, matrix,
paint);//画出关闭时的背景
              paint.setColor(Color.WHITE);
              paint.setFakeBoldText(true);
              paint.setTextSize(40);
              canvas.drawText(mOffText,
(bg_off.getWidth()-slipper_btn.getWidth())/2,
(bg_off.getHeight()+30)/2, paint);
        }else{  
            canvas.drawBitmap(bg_on, matrix, paint);//画出打开时的背景 
 
            canvas.drawBitmap(bg_on, matrix, paint);//画出打开时的背景 
 
            paint.setColor(Color.WHITE);
            paint.setFakeBoldText(true);
            paint.setTextSize(40);
           
canvas.drawText(mOnText,(bg_on.getWidth()-slipper_btn.getWidth())/2,
(bg_on.getHeight()+30)/2, paint);
        }  
          
        if (onSlip) {//是否是在滑动状态,    
            if(nowX >=
bg_on.getWidth())//是否划出指定范围,不能让滑块跑到外头,必须做这个判断
 
                x = bg_on.getWidth() –
slipper_btn.getWidth()/2;//减去滑块1/2的长度  
            else  
                x = nowX – slipper_btn.getWidth()/2;  
        }else {  
            if(nowStatus){//根据当前的状态设置滑块的x值  
                x = bg_on.getWidth() – slipper_btn.getWidth();  
            }else{  
                x = 0;  
            }  
        }  
          
        //对滑块滑动进行异常处理,不能让滑块出界  
        if (x < 0 ){  
            x = 0;  
        }  
        else if(x > bg_on.getWidth() – slipper_btn.getWidth()){  
            x = bg_on.getWidth() – slipper_btn.getWidth();  
        }  
          
        //画出滑块  
        canvas.drawBitmap(slipper_btn, x , 0, paint);   
    }  
 
    @Override  
    public boolean onTouch(View v, MotionEvent event) {  
        switch(event.getAction()){  
        case MotionEvent.ACTION_DOWN:{  
            if (event.getX() > bg_off.getWidth() || event.getY()
> bg_off.getHeight()){  
                return false;  
            }else{  
                onSlip = true;  
                downX = event.getX();  
                nowX = downX;  
            }  
            break;  
        }  
        case MotionEvent.ACTION_MOVE:{  
            nowX = event.getX();  
            break;  
        }  
        case MotionEvent.ACTION_UP:{  
            onSlip = false;  
            if(event.getX() >= (bg_on.getWidth()/2)){  
                nowStatus = true;  
                nowX = bg_on.getWidth() – slipper_btn.getWidth();  
            }else{  
                nowStatus = false;  
                nowX = 0;  
            }  
              
            if(listener != null){  
                listener.OnChanged(WiperSwitch.this, nowStatus);  
            }  
            break;  
        }  
        }  
        //刷新界面  
        invalidate();  
        return true;  
    }  
      
      
      
    /**
     * 为WiperSwitch设置一个监听,供外部调用的方法
     * @param listener
     */  
    public void setOnChangedListener(OnChangedListener listener){  
        this.listener = listener;  
    }  
      
    /**
     * 设置滑动开关的初始状态,供外部调用
     * @param checked
     */  
    public void setChecked(boolean checked){  
        if(checked){  
            nowX = bg_off.getWidth();  
        }else{  
            nowX = 0;
        }  
        nowStatus = checked;  
    }  
    /**
     * 回调接口
     * @author len
     *
     */  
    public interface OnChangedListener {  
        public void OnChanged(WiperSwitch wiperSwitch, boolean
checkState);  
    }  
 
 

永利澳门游戏网站 1paint.png

package com.etong.cpms.widget;

永利澳门游戏网站 2tou.png

 

  • fontMetrics.bottom; canvas.drawColor(isfollow == true ?
    Color.parseColor(“#00CE7E”) : Color.parseColor(“#B7B7B7”));
    bgPaint.setColor(isfollow == true ? Color.parseColor(“#B7B7B7”) :
    Color.parseColor(“#00CE7E”)); canvas.drawCircle(centerX, centerY,
    radius, bgPaint); canvas.drawText(isfollow == true ? “取消啊” : “关注”,
    width / 2, textBaseY, textPaint); }</code></pre>

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注