转自:http://blog.sina.com.cn/s/blog_691051e10101a3by.html

 
很多时候没有我们需要使用的控件,或者控件并不美观。比如这个滑动开关,这是android之后的版本才提供的控件,新版本并不提供,这个时候就需要我们自定义控件了。
 
一个2个主要类,OnChangedListener,SlipButton
 
SlipButton代码如下
package com.appipv6.android.slipbutton;
 
import com.appipv.onoff.R;
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;  
//用户是否在滑动
private boolean onSlip=false;
//按下时的X,当时的X
private float downX,nowX;
//打开和关闭状态下的,游标的Rect
private Rect btn_On,btn_Off;
 
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();
}
 
public SlipButton(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
init();
}
 
private void init()
{
// TODO Auto-generated method stub
bg_on=BitmapFactory.decodeResource(getResources(), R.drawable.on);
bg_off=BitmapFactory.decodeResource(getResources(), R.drawable.off);
slip_btn=BitmapFactory.decodeResource(getResources(), R.drawable.my_btn);
int tmp=bg_off.getWidth()/2;
btn_On=new Rect(tmp, 0, slip_btn.getWidth()+tmp, slip_btn.getHeight());
btn_Off=new Rect(bg_off.getWidth()-tmp-slip_btn.getWidth(), 0, bg_off.getWidth()-tmp, slip_btn.getHeight());
setOnTouchListener(this);
}
@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(onSlip)
{
if(nowX>=bg_on.getWidth())
{
x=bg_on.getWidth()-slip_btn.getWidth()/2;
}else{
x=nowX-slip_btn.getWidth()/2;
}
}else{
if(nowChoose)
{
x=btn_On.left;
}else{
x=btn_Off.left;
}
}
if(nowX<(bg_on.getWidth()/2))
{
canvas.drawBitmap(bg_off, matrix, paint);
}else{
canvas.drawBitmap(bg_on, matrix, paint);
}
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);
}
 
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:
break;
}
invalidate();
return true;
}
public void setOnChangeListener(OnChangedListener l)
{
isChgLsnOn=true;
ChgLsn=l;
}
 
public boolean isNowChoose()
{
return nowChoose;
}
 
public void setNowChoose(boolean nowChoose)
{
this.nowChoose = nowChoose;
nowX=btn_On.left;
invalidate();
}
 
}
 
 
OnChangedListener代码如下
public interface OnChangedListener
{
abstract void OnChanged(boolean CheckState);
}
 
 
主Activity代码如下
 
package com.appipv.onoff;
 
import com.appipv6.android.slipbutton.OnChangedListener;
import com.appipv6.android.slipbutton.SlipButton;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
 
public class OnOffActivity extends Activity
{
private SlipButton slipButton1;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SlipButton slipButton = (SlipButton) findViewById(R.id.slipButton1);
slipButton.setNowChoose(true);
slipButton1 = (SlipButton) findViewById(R.id.slipButton2);
 
slipButton.setOnChangeListener(new OnChangedListener()
{
 
public void OnChanged(boolean CheckState)
{
// TODO Auto-generated method stub
String s;
if(slipButton1.isNowChoose())
{
s="Button2打开了...";
}else{
s="Button2关闭了...";
}
if (CheckState)
Toast.makeText(OnOffActivity.this, "Button1打开了..."+s,
Toast.LENGTH_SHORT).show();
else
Toast.makeText(OnOffActivity.this, "Button1关闭了..."+s,
Toast.LENGTH_SHORT).show();
}
});
}
}
布局文件代码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="@drawable/back"
    >
 
    <com.appipv6.android.slipbutton.SlipButton
        android:id="@+id/slipButton1"
        android:layout_width="wrap_content"
        android:layout_height="49dp" />
 
 <com.appipv6.android.slipbutton.SlipButton
     android:id="@+id/slipButton2"
     android:layout_width="wrap_content"
     android:layout_height="fill_parent" />
 
</LinearLayout>
 
 

android自定义控件的一个思路-入门的更多相关文章

  1. Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程

    Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...

  2. Android自定义控件(状态提示图表) (转)

    源:Android自定义控件(状态提示图表) 源:Android应用开发 [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1  背景 前面分析 ...

  3. android自定义控件实现TextView按下后字体颜色改变

    今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能 直接看图片             第一张是按下后截的图,功能很简单, ...

  4. Android自定义控件:进度条的四种实现方式(Progress Wheel的解析)

    最近一直在学习自定义控件,搜了许多大牛们Blog里分享的小教程,也上GitHub找了一些类似的控件进行学习.发现读起来都不太好懂,就想写这么一篇东西作为学习笔记吧. 一.控件介绍: 进度条在App中非 ...

  5. [置顶] xamarin android toolbar(踩坑完全入门详解)

    网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...

  6. Android自定义控件实现带有清除按钮的EditText

    首先声明我也是参考了别人的思路,只是稍微做了下修改,增加显示密码与隐藏密码,没有输入字符串时让EditText进行抖动,废话少说这里附上效果图 效果很赞有木有 那么怎么实现这种效果呢?那就跟着我一起来 ...

  7. Android自定义控件View(三)组合控件

    不少人应该见过小米手机系统音量控制UI,一个圆形带动画效果的音量加减UI,效果很好看.它是怎么实现的呢?这篇博客来揭开它的神秘面纱.先上效果图 相信很多人都知道Android自定义控件的三种方式,An ...

  8. [转]Android自定义控件:进度条的四种实现方式(Progress Wheel的解析)

    最近一直在学习自定义控件,搜了许多大牛们Blog里分享的小教程,也上GitHub找了一些类似的控件进行学习.发现读起来都不太好懂,就想写这么一篇东西作为学习笔记吧. 一.控件介绍: 进度条在App中非 ...

  9. Android自定义控件之自定义ViewGroup实现标签云

    前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...

随机推荐

  1. div始终在底部

    <style type="text/css">body{margin:0;padding:0; } html,body{height:100%;}div{width:1 ...

  2. 推荐十款java开源中文分词组件

    1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...

  3. 51nod1269Devu and Flowers

    题解: 如果没有限制每一种花有多少,那么就是简单的排列组合问题. 那么我们强制让一些花一定都要选. 暴力搜索,然后组合数(逆元) 采用容斥原理来计算最后的答案 代码: #include<bits ...

  4. JQ插件写法 扩展JQ方法

    目录: 1.基本JQ扩展插件js的格式 2.对JQ选中元素的方法的扩展,调用类似于$("selector").myMethod(),这里的myMethod是自己扩展的方法,与.cl ...

  5. Maven入门-3.pom文件和settings文件

    1.pom.xml文件介绍2.settings.xml文件介绍 1.pom.xml文件介绍 Maven项目的核心是pom.xml,pom(Project Object Model项目对象模型) pom ...

  6. ide fix pack for delph 10.2.3发布了

    http://andy.jgknet.de/blog/ide-tools/ide-fix-pack/ IDE Fix Pack是RAD Studio IDE,Win32 / Win64 / Andoi ...

  7. Nexus设备渗透测试平台 – Kali Linux NetHunter

    NetHunter是一个基于Kali Linux为Nexus设备构建的Android渗透测试平台,其中包括一些特殊和独特的功能.NetHunter支持无线802.11注入,一键MANA AP搭建,HI ...

  8. pyqt5:图片自适应QLabel大小和图片移除

    参考链接: https://www.e-learn.cn/content/qita/669569 图片自适应QLabel大小 # coding=utf- import sys from PyQt5.Q ...

  9. DS博客作业04--树大作业说明

    大作业题目说明 1.目录树 按照如下目录路径,设计一颗目录树保存.并能实现对目录树遍历.目录路径存在file.txt,格式如下: b.txt c\ ab\cd.txt a\bc.txt ab\d.tx ...

  10. win10笔记本实现双屏显示的自如切换

    前言 使用电脑的过程中想一边看内容,一边进行编辑,这就涉及到双屏显示并实现扩展分屏,本文就介绍一下这些操作. 工具 win10-thinkpad-E470:另一块显示屏(博主的是戴尔的显示器):一条外 ...