您的位置:首页 > 移动开发 > Android开发

android基础笔记——自定义控件和视图:放ios系统开关按钮

2014-10-21 10:39 399 查看
代码效果:



实现按钮可以通过手指的拖动,开进行开和关的操作。
一、首先要完成按钮的绘制操作,也就是把按钮做成如图的样子;
1、首先创建一个类,继承View,并完成构造方法:
public MyToggleButton(Context context, AttributeSet attrs)

2、通过 BitmapFactory.decodeResource 方法,将资源文件中的图片,解析、创建成 Bitmap 对象;

一个View对象从创建到显示在屏幕上,有以下几步:
1、通过构造方法创建View对象;

2、获得View的大小;

涉及的方法:protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

3、获得View的位置;

4、绘制View的内容。

涉及的方法:protected void onDraw(Canvas canvas)

3、重写 onMeasure 方法,用于测量 View 的大小;

4、重写 onDraw 方法,用于绘制 View 的内容;

5、重写 onTouchEvent 方法,编写 down、move、up 时需要实现的代码。

主要代码:

package com.example.toggle;

import java.security.acl.LastOwnerException;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class MyToggleButton extends View {
private String tag = "MyToggleButton";
private Bitmap backgroundBitmap;
private Bitmap slideBtn;
private Paint paint;
// 滑动按钮的左边距
private float slideBtn_left;

private boolean currentState = false;

// 构造方法
public MyToggleButton(Context context, AttributeSet attrs) {

super(context, attrs);
Log.i(tag, "MyToggleButton方法");
// TODO Auto-generated constructor stub
initView();
// 创建一个画笔对象,并设置其属性:抗锯齿为TRUE
paint = new Paint();
paint.setAntiAlias(true);
Log.i(tag, "结束MyToggleButton方法");
}

// 测量View的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);该方法本身就是调用
// setMeasuredDimension 方法,所以可直接调用 setMeasuredDimension 方法;
// 设置View的大小
setMeasuredDimension(backgroundBitmap.getWidth(), backgroundBitmap.getHeight());
}

// 绘制View的内容
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
// canvas 画布
Log.i(tag, "onDraw方法");
// 绘制一个Bitmap,该bitmap为按钮的背景
/**
* drawBitmap(Bitmap bitmap, float left, float top, Paint paint)
* 绘制一个Bitmap
* ,第一个参数是需要绘制的bitmap,第二个参数是绘制的左边位置,第三个蚕食是绘制的上边位置,第二和第三个参数结合,就是左上角的位置
* ,第四个参数是画笔
*/
canvas.drawBitmap(backgroundBitmap, 0, 0, paint);
// 绘制一个Bitmap,该bitmap为按钮,因为按钮需要左右滑动,所以,left值为一个变量:sildeBtn_left
canvas.drawBitmap(slideBtn, slideBtn_left, 0, paint);
Log.i(tag, "结束onDraw方法");
}

//	public void onClick(View v) {
//		// TODO Auto-generated method stub
//		Log.i(tag, "onClick方法");
//		currentState = !currentState;
//		flushState();
//		Log.i(tag, "结束onClick方法");
//	}

private void initView() {
Log.i(tag, "initView方法");
// TODO Auto-generated method stub
// 获得按钮的背景图片和按钮的图片
backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
slideBtn = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);

// setOnClickListener(this);
Log.i(tag, "结束initView方法");
}

// private void flushState() {
// Log.i(tag, "flushState方法");
// // currentState为true
// if (currentState) {
// slideBtn_left = backgroundBitmap.getWidth() - slideBtn.getWidth();
// } else {
// slideBtn_left = 0;
// }
// // 刷新当前View ,会导致执行 onDraw 方法。
// invalidate();
// Log.i(tag, "结束flushState方法");
// }

private int firstX;
private int lastX;

@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//Toast.makeText(getContext(), "down", 0).show();
// firstX = lastX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
// 手指在屏幕上移动的距离
int dis = (int) (event.getX() - lastX);
lastX = (int) event.getX();
// 设置左边距
slideBtn_left = slideBtn_left + dis;
break;
case MotionEvent.ACTION_UP:
// 计算左边距的最大值
int maxLeft = backgroundBitmap.getWidth() - slideBtn.getWidth();
/*
* 根据 slideBtn_left 判断,当前应是什么状态
*/
if (slideBtn_left > maxLeft / 2) {
slideBtn_left = backgroundBitmap.getWidth() - slideBtn.getWidth();
} else {
slideBtn_left = 0;
}
// flushState();
break;

}
flushView();
return true;
}

// 用于限制按钮不能移出背景图片的长度
private void flushView() {
Log.i(tag, "flushView方法");
int maxLeft = backgroundBitmap.getWidth() - slideBtn.getWidth();
slideBtn_left = (slideBtn_left > 0) ? slideBtn_left : 0;
slideBtn_left = (slideBtn_left < maxLeft) ? slideBtn_left : maxLeft;
invalidate();
}
}

使用这个自定义的控件时,需要使用全名:



<com.example.toggle.MyToggleButton
android:id="@+id/my_toggle_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: