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 时需要实现的代码。
主要代码:
使用这个自定义的控件时,需要使用全名:
实现按钮可以通过手指的拖动,开进行开和关的操作。
一、首先要完成按钮的绘制操作,也就是把按钮做成如图的样子;
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" />
相关文章推荐
- android基础笔记——自定义控件和视图:下拉菜单
- android基础笔记——自定义控件和视图:优酷菜单:RotateAnimation
- 自定义控件(视图)28期笔记07:自定义控件之 自定义属性(开关按钮案例的优化)
- Android自定义控件——仿ios开关按钮
- Android自定义控件——仿ios开关按钮
- Android自定义控件——仿ios开关按钮
- Android自定义控件——仿ios开关按钮
- Android自定义控件系列四:自定义开关按钮(三)--- 自定义属性
- iOS开发学习笔记 (一)表视图基础 Table Views
- Android自定义控件系列三:自定义开关按钮(二)
- android安卓开发基础小笔记,添加按钮事件,打开新窗体,窗体传值,回传
- Android自定义控件系列二:自定义开关按钮(一)
- Android自定义控件系列三:自定义开关按钮(二)
- Android自定义控件系列二:自定义开关按钮
- iOS开发笔记--将视图或者按钮设置为圆形
- Android自定义控件系列三:自定义开关按钮(二)
- Android基础入门教程——2.3.6 开关按钮ToggleButton和开关Switch
- Android自定义控件系列二:自定义开关按钮(一)
- IOS开发基础教程学习笔记3 使用Tab Bar切换视图
- android基础笔记——用一个监听器,实现多个按钮的监听