android自定义组件实例,实现自定义组件(小案例)

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

{

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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值