1. 程式人生 > >自定義switchButton

自定義switchButton

build 疊加 version listener layout viewgroup height div 定義

這篇博客要講的是自定義switchButton,不過沒有設置動畫效果。

我用GradientDrawable來繪制switchButton,我們先看看最終的效果:

點擊前:

技術分享圖片

點擊後

技術分享圖片

接下來我們看看如何實現

首先:該類繼承RelativeLayout

SwitchButton extends RelativeLayout{
}

該類需要用到的成員:

    private ImageView track; //滑塊所在的軌道
    private ImageView slider; //switchButton上面的滑塊

    private GradientDrawable trackDrawable; //用於繪制軌道
    
private GradientDrawable sliderDrawable; //用於繪制滑塊 private LayoutParams trackLy; //軌道的布局 private LayoutParams sliderLy; //滑塊的布局
private boolean isCkeck = false; //是否點擊

構造方法:

public SwitchButton(Context context) {
        super(context);
        init();
    }

    public SwitchButton(Context context, AttributeSet attrs) {
        
super(context, attrs); init(); }

private void init(){
        setClickable(true);
        setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        track = new ImageView(getContext());
        slider = new ImageView(getContext());

        trackLy 
= new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); trackLy.addRule(CENTER_VERTICAL); sliderLy = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); sliderLy.addRule(CENTER_VERTICAL); track.setLayoutParams(trackLy); slider.setLayoutParams(sliderLy); trackDrawable = new GradientDrawable(); sliderDrawable = new GradientDrawable();
//軌道的形狀,顏色,大小,邊緣,角度 trackDrawable.setShape(GradientDrawable.RECTANGLE); trackDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF)); trackDrawable.setSize(getResources().getDimensionPixelOffset(R.dimen.track_width), getResources().getDimensionPixelOffset(R.dimen.track_height)); trackDrawable.setStroke(getResources().getDimensionPixelOffset(R.dimen.switch_button_stroke), getResources().getColor(R.color.gray)); trackDrawable.setCornerRadius(getResources().getDimension(R.dimen.switch_button_cornerRadius));
//設置滑塊的形狀,顏色,大小,邊緣,角度 sliderDrawable.setShape(GradientDrawable.OVAL); sliderDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF)); sliderDrawable.setSize(getResources().getDimensionPixelOffset(R.dimen.slider_size), getResources().getDimensionPixelOffset(R.dimen.slider_size)); sliderDrawable.setStroke(getResources().getDimensionPixelOffset(R.dimen.switch_button_stroke), getResources().getColor(R.color.gray)); //設置給imageView track.setImageDrawable(trackDrawable); slider.setImageDrawable(sliderDrawable); addView(track); addView(slider); setOnClickListener(
this); }

設置點擊事件

@Override
    public void onClick(View view) {
        if (isCkeck)
        {
            isCkeck = false;
        }else {
            isCkeck = true;
        }
        setCheck(isCkeck);
    }
private void setCheck(boolean isCheck){
        if (isCheck){
//軌道變為藍色 trackDrawable.setColor(getResources().getColor(R.color.blue));
//註意這裏進行版本判斷。if與else裏面代碼的效果是相同的,只是有些代碼在某些版本下才能夠用
if (Build.VERSION.SDK_INT >= 17) { sliderLy.addRule(ALIGN_PARENT_END);
//設置新的布局之前,要先移除之前的布局,否則會有疊加的效果 sliderLy.removeRule(ALIGN_PARENT_START); }
else { sliderLy.addRule(ALIGN_PARENT_RIGHT); sliderLy.addRule(ALIGN_PARENT_LEFT,0); } slider.setLayoutParams(sliderLy); }else { trackDrawable.setColor(getResources().getColor(R.color.white_FFFFFFFF)); if (Build.VERSION.SDK_INT >= 17) { sliderLy.removeRule(ALIGN_PARENT_END); sliderLy.addRule(ALIGN_PARENT_START); } else { sliderLy.addRule(ALIGN_PARENT_RIGHT,0); sliderLy.addRule(ALIGN_PARENT_LEFT); } slider.setLayoutParams(sliderLy); } }

以上便是所有的代碼。

請尊重勞動成果,轉載請標明出處:http://www.cnblogs.com/tangZH/p/8277428.html

自定義switchButton