`
longgangbai
  • 浏览: 7342952 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自定义Switch控件

 
阅读更多
package com.easyway.widget;



import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
/**
 * 
 * 
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-8-17
 * @author  longgangbai
 * @version 1.0
 */
public class Switch extends ImageView {
    private static final String TAG = "Switch";
    private static final int TEXT_SIZE = 12;
    private OnCheckedChangeListener mOnCheckedChangeListener;
    private boolean mChecked;
    private Paint mPaint;
    private String mCheckedString, mUnCheckedString;
    public interface OnCheckedChangeListener {
        public void onCheckedChanged(Switch switchView, boolean isChecked);
    }

    public Switch(Context context) {
        this(context, null);
    }

    public Switch(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public Switch(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // init desity dpi,之前引用屏幕密度的时候出现问题,去掉密度,按实际的宽和高的比例来设置文字的位置
//        DisplayMetrics metric = new DisplayMetrics();
//        WindowManager windowManager = (WindowManager) context
//                .getSystemService(Context.WINDOW_SERVICE);
//        windowManager.getDefaultDisplay().getMetrics(metric);
//        mDensity = metric.density;
        mCheckedString = context.getResources().getString(R.string.switch_on);//业务功能开启时的图片显示文字字符串:即ON
        mUnCheckedString = context.getResources().getString(R.string.switch_off);//OFF
        setBackgroundResource(R.drawable.white_btn);//设置开关按钮的背景
        setChecked(false);//初始化控件为关的状态
        configPaint();//设置画布属性(去掉密度,直接以字体12显示)
       // computePosition();
    }

  // private void computePosition() {
//        mLeftTextX = LEFT_STATE_STRING_MARGIN_LEFT * mDensity;
//        mRightTextX = RIGHT_STATE_STRING_MARGIN_LEFT * mDensity;
//        mTextY = STRING_MARGIN_TOP * mDensity;
    	//modify by chengxi
//      mLeftTextX = getWidth()/2/3 * mDensity;
//      mRightTextX =getWidth()/2* mDensity;
//      mTextY = STRING_MARGIN_TOP * mDensity; 	
 //   }

    private void configPaint() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);//去文字锯齿
      //  mPaint.setTextSize(TEXT_SIZE * mDensity);
        mPaint.setTextSize(TEXT_SIZE);
        mPaint.setColor(Color.WHITE);//画布背景即文字字体的颜色
    }

    public void setChecked(boolean checked) {
        mChecked = checked;
        if (mChecked) {
            setImageResource(R.drawable.on_btn);
        } else {
            setImageResource(R.drawable.off_btn);
        }
        postInvalidate();
            //见http://blog.csdn.net/sdhjob/article/details/6512973
            //View的invalidate和postInvalidate都是更新界面,不同的是
            //invalidate与创建VIEW都是在同一个线程中执行的,即主线程,如果在非主线程中执行的话需要配合Handler使用
            //而postInvalidate可以在非主线程中更新UI界面

    }

    public boolean isChecked() {
        return mChecked;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mChecked) {
            // draw checked
        //	canvas.drawText(mCheckedString, (getWidth()*0.6f), getHeight()*0.7f, mPaint);
        } else { 
            // draw unchecked
        //	canvas.drawText(mUnCheckedString, getWidth()*0.1f , getHeight()*0.7f, mPaint);
        }
    //画VIEW的时候开始画的点(0,0)是在左上角,图片从左上往下画,画文字的时候开始画的点是在左下角,文字从左下往上画
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_UP:
                setChecked(!mChecked);
                if (mOnCheckedChangeListener != null) {
                    mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
                }
                break;
            default:
                // Do nothing
                break;
        }

        return true;
    }

    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
        mOnCheckedChangeListener = listener;
    }

}

 

 

布局文件:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:orientation="vertical"
    android:id="@+id/dialog">  

    <com.easyway.widget.Switch
        android:id="@+id/switch1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/white_btn" />

    <TextView
           android:layout_width="wrap_content"
        android:layout_height="12sp"
         />
    <com.easyway.widget.Switch
        android:id="@+id/switch2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/white_btn" />
  
</LinearLayout>  

 

 

代码如下:

 

分享到:
评论

相关推荐

    Android自定义Switch控件

    我们将从以下几个方面来详细讲解这个自定义Switch控件: 1. **基础理解**:Switch控件在Android中是ToggleButton的升级版,它提供了开/关两种状态,并且外观类似开关。原生的Switch控件允许开发者通过textOn和...

    android自定义Switch控件详解

    要自定义Switch控件,我们需要创建一个新的View类,继承自Android的CompoundButton。CompoundButton是CheckBox和RadioButton的父类,它提供了一个可以绑定任意boolean值的接口。我们可以通过重写它的onDraw()方法...

    自定义switch开关控件源码

    自定义switch控件源码,支持文字、图标形式的开关

    自定义安卓中的Switch控件

    自定义Switch控件可以让我们根据项目需求实现更个性化、更美观的效果。本篇文章将详细探讨如何在Android中实现一个全版本通用的自定义Switch控件。 1. **基础概念** Switch控件是Android提供的一个ToggleButton的...

    NKColorSwitch, iOS的可以自定义平面样式 switch 控件.zip

    NKColorSwitch, iOS的可以自定义平面样式 switch 控件 NKColorSwitchiOS的平面样式UISwitch控件。支持可以自定义的控制颜色,大小和形状。 需要 iOS 5 和 arc 。安装将NKColorSwitch文件夹添加到项目中并导入" ...

    Android Switch控件自定义

    在Android开发中,Switch控件是一种常用的...在实际项目中,自定义Switch控件能够提升应用的视觉吸引力,并增强用户操作的感知。在进行自定义时,应兼顾功能性和美观性,确保在各种屏幕尺寸和分辨率下都能正常工作。

    自定义Android 4.0 Switch控件样式示例

    在Android开发中,Switch控件是一种非常常用的开关组件,它结合了CheckBox的功能和ToggleButton的视觉效果,可以...通过实践这些技巧,你将能够创建出符合自己应用风格的自定义Switch控件,并实现与系统功能的交互。

    仿酷我音乐顶部switch控件

    文件名"SlieSwitch"可能是自定义Switch控件的Java源代码文件。在这个文件中,你可以看到类定义、构造函数、属性声明、绘制方法(如onDraw())、触摸事件处理(如onTouchEvent())以及其他自定义功能的实现。为了使...

    iOS Switch 控件的动画集合.zip

    这就需要我们自定义Switch控件。自定义通常涉及以下几个方面: 1. **外观定制**:可以使用自定义视图或者使用系统提供的`appearance` API来改变Switch的颜色、大小、背景等。 2. **动画效果**:通过实现`UIView`的...

    ios-自定义Switch.zip

    这个名为“ios-自定义Switch.zip”的压缩包文件提供了一个名为“LCESwitch”的自定义开关控件。`LCESwitch`可能是作者为了实现特定功能或视觉效果而设计的。下面我们将深入探讨如何在iOS中自定义`Switch`以及可能...

    Wpf自定义控件ToggleSwitch

    在Windows Presentation Foundation (WPF) 中,自定义控件能够帮助开发者实现独特的用户界面和交互体验。本项目“WpfToggleSwitch”就是这样一个例子,它是一个从国外开源网站获取的优秀自定义控件,用于创建类似iOS...

    android之自定义开关控件

    在Android开发中,自定义控件是提升应用用户体验和界面美观度的重要手段。"android之自定义开关控件"这个主题旨在教你如何在Android平台上创建一个类似苹果iOS Toggle的自定义开关组件。以下是对这个主题的详细讲解...

    自定义开关控件

    首先,Android原生的Switch控件是系统提供的开关选择器,它通常用于二选一的选择,例如开启或关闭某个功能。原生的Switch控件已经具备了基础的交互和视觉效果,但在某些场景下,我们可能需要更个性化的外观来匹配...

    android自定义控件Switch

    本示例中的"Switch"是一个自定义版本的开关按钮,它模仿了原生Android SDK中的`SwitchCompat`或者`android.widget.Switch`控件,但可能包含了开发者个人的优化或者特色功能。以下是对这个自定义控件Switch的知识点...

    安卓仿iOS控件Switch(动画效果)Eclipse

    自定义Switch控件的主要工作包括以下几个方面: 1. **绘制背景**:在onDraw()方法中,使用Canvas绘制开关的背景,包括滑块和开关轨道。通常需要考虑不同状态下的背景颜色,如开/关状态、是否被触摸等。 2. **绘制...

    android自定义switch

    在Android开发中,`Switch`控件是一种常用的开关选择器,它在用户界面中用于切换两种状态,通常表现为开和关。然而,Android系统自带的`Switch`控件可能无法满足开发者的所有需求,比如样式、动画效果或者交互方式等...

    仿android4.0 switch控件

    这篇博客“仿android4.0 switch控件”可能探讨了如何在更早或自定义版本的Android系统上实现与Android 4.0相似的Switch效果。 首先,我们来了解下原生Android 4.0 Switch控件的特点: 1. **设计风格**:Android 4.0...

Global site tag (gtag.js) - Google Analytics