- 浏览: 114581 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
瘾心丶Android:
[color=red][/colo[size=large][/ ...
android捕获Home键的方法 -
j086924:
good share!
android Launcher——ui框架 -
m331006:
a、进入cocos2d-x\testandroid\andro ...
Android cocos2d-x开发(三)之创建Android工程和编译 -
sphway:
为什么在布局文件中加入android:layout_gravi ...
自定义控件---滑动按钮的实现 -
chenshijun0101:
LZ,你能把长按home键显示当前任务实现此功能的源码发给我一 ...
长按home键显示当前任务
package cn.flyaudio.android; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; 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 String TAG = "SlipButton"; private boolean onSlip = false;//记录用户是否在滑动的变量 private float downX, nowX, oldX;//按下时的x,当前的x private Bitmap slip_btn_down, slip_btn_thumb, slip_btn_up, slip_btn_bg;//图片 private Rect slip_thumb_rect;//矩形 public SlipButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub init(context, attrs); } public SlipButton(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(context, attrs); } //初始化 private void init(Context context, AttributeSet attrs) { // 跟values/attrs.xml里面定义的属性绑定 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlipButton); slip_btn_down = drawableToBitmap(a.getDrawable(R.styleable.SlipButton_slip_btn_down)); //按下图片 slip_btn_thumb = drawableToBitmap(a.getDrawable(R.styleable.SlipButton_slip_btn_thumb));//滑动图片 slip_btn_up = drawableToBitmap(a.getDrawable(R.styleable.SlipButton_slip_btn_up)); //为按下的图片 //返回一个绑定结束的信号给资源 a.recycle(); slip_btn_bg = slip_btn_up; slip_thumb_rect = new Rect(0, 0, slip_btn_bg.getWidth(), slip_btn_bg.getHeight()); setOnTouchListener(this);// 设置监听器 } //绘制部分 @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); Paint paint = new Paint(); canvas.drawBitmap(slip_btn_bg, 0, 0, paint); if(!onSlip){//在没有滑动的情况下 if(nowX <= slip_btn_bg.getWidth()/2){ canvas.save();//记录原来的canvas状态 canvas.clipRect(slip_thumb_rect); canvas.drawBitmap(slip_btn_thumb,slip_btn_bg.getWidth()-slip_btn_thumb.getWidth(),0,paint); canvas.restore();//恢复canvas状态 }else if(nowX > slip_btn_bg.getWidth()/2){ canvas.save();//记录原来的canvas状态 canvas.clipRect(slip_thumb_rect); canvas.drawBitmap(slip_btn_thumb,0, 0,paint); canvas.restore();//恢复canvas状态 } }else if(onSlip){//在滑动的情况下 canvas.save();//记录原来的canvas状态 canvas.clipRect(slip_thumb_rect); if(nowX < oldX){//向左滑的时候 if((nowX-oldX) > slip_btn_bg.getWidth()-slip_btn_thumb.getWidth()){ canvas.drawBitmap(slip_btn_thumb,nowX-oldX, 0,paint); }else{ canvas.drawBitmap(slip_btn_thumb,slip_btn_bg.getWidth()-slip_btn_thumb.getWidth(), 0,paint); } }else if(nowX > oldX ){//向右滑的时候 if((slip_btn_bg.getWidth()-slip_btn_thumb.getWidth()) +(nowX - oldX) <0){ canvas.drawBitmap(slip_btn_thumb,(slip_btn_bg.getWidth()-slip_btn_thumb.getWidth()) +(nowX - oldX), 0,paint); }else{ canvas.drawBitmap(slip_btn_thumb,0, 0,paint); } } canvas.restore();//恢复canvas状态 } } //逻辑控制部分 @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch(event.getAction())//根据动作来执行代码 { case MotionEvent.ACTION_MOVE://滑动 if(event.getX()>slip_btn_bg.getWidth()||event.getY()>slip_btn_bg.getHeight() || event.getX()<0 || event.getY()<0) return false; slip_btn_bg = slip_btn_down; nowX = event.getX(); //得到的是触摸点相对于按钮的坐标 onSlip = true; break; case MotionEvent.ACTION_DOWN://按下 if(event.getX()>slip_btn_bg.getWidth()||event.getY()>slip_btn_bg.getHeight() || event.getX()<0 || event.getY()<0) return false; slip_btn_bg = slip_btn_down; downX = event.getX(); nowX = downX; oldX = downX; break; case MotionEvent.ACTION_UP://松开 slip_btn_bg = slip_btn_up; onSlip = false; break; default: } invalidate();//重画控件 return true; } //将drawable转换为bitmap public static Bitmap drawableToBitmap(Drawable drawable) { // 取 drawable 的长宽 int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); // 取 drawable 的颜色格式 Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; // 建立对应 bitmap Bitmap bitmap = Bitmap.createBitmap(w, h, config); // 建立对应 bitmap 的画布 Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); // 把 drawable 内容画到画布中 drawable.draw(canvas); return bitmap; } }
今天在公司写了一个自定义控件,主要是一个可以实现左右滑动的自定义按钮。
里面的涉及到的一些知识点主要有:
1、自定义控件的属性的设置;
2、自定义控件怎么继承View这个父类来写控件;
首先是自定义控件属性的设置:
- 先在values文件夹下写一个xml文件,文件名为:attrs.xml
-
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="SlipButton"><!-- 控件名称--> <!-- 属性名称,类型--> <attr name="slip_btn_down" format="reference"/> <attr name="slip_btn_thumb" format="reference"/> <attr name="slip_btn_up" format="reference"/> </declare-styleable> </resources>
-
控件属性与XML定义绑定: // 跟values/attrs.xml里面定义的属性绑定 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlipButton); slip_btn_down = drawableToBitmap(a.getDrawable(R.styleable.SlipButton_slip_btn_down)); //按下图片 slip_btn_thumb = drawableToBitmap(a.getDrawable(R.styleable.SlipButton_slip_btn_thumb));//滑动图片 slip_btn_up = drawableToBitmap(a.getDrawable(R.styleable.SlipButton_slip_btn_up)); //为按下的图片 //返回一个绑定结束的信号给资源 a.recycle();
-
//将drawable转换为bitmap public static Bitmap drawableToBitmap(Drawable drawable) { // 取 drawable 的长宽 int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); // 取 drawable 的颜色格式 Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; // 建立对应 bitmap Bitmap bitmap = Bitmap.createBitmap(w, h, config); // 建立对应 bitmap 的画布 Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); // 把 drawable 内容画到画布中 drawable.draw(canvas); return bitmap;
TypedArray其实就是一个存放资源的Array,首先从上下文中获取到
-
R.styleable.SlipButton这个属性资源的资源数组。 attrs是构造函数传进来,应该就是对应attrs.xml文件。 a.getString(R.styleable.SlipButton_slip_btn_thumb);这句代码就是获取attrs.xml中定义的属性,并将这个属 性的值传给本控件的slip_btn_thumb.最后,返回一个绑定结束的信号给资源:a.recycle();绑定结束。 在xml中对控件赋初始值: <?xml version="1.0" encoding="utf-8"?> <!-- 一定要声明命名空间 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:flyaudio="http://schemas.android.com/apk/res/cn.flyaudio.android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <cn.flyaudio.android.SlipButton android:id = "@+id/slipBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft = "100sp" flyaudio:slip_btn_thumb="@drawable/slip_btn_thumb" flyaudio:slip_btn_down="@drawable/slip_btn_down" flyaudio:slip_btn_up="@drawable/slip_btn_up" /> </LinearLayout> 红色部分首先声明命名空间。命名空间为fsms.路径是http://schemas.android.com/apk/res/ 这一部分是不变的, 后面接的是R的路径:cn.flyaudio.android。 然后在自定义控件的xml描述中就可以这样使用flyaudio:slip_btn_thumb="@drawable/slip_btn_thumb" 。这样就实现了自定义控件的初始化赋值。
- SlipButtonTest.zip (88.6 KB)
- 下载次数: 107
评论
1 楼
sphway
2012-12-10
为什么在布局文件中加入android:layout_gravity="center_horizontal"不起作用,难道只能用layout_marginLeft把位置写死吗?
发表评论
-
Android Service学习之AIDL, Parcelable和远程服务
2012-06-26 19:33 648AIDL的作用 由于每 ... -
Android的系统的Binder机制(一)
2012-06-21 19:11 600Android系统的Binder机制之一—— ... -
Android的系统的Binder机制(一)
2012-06-21 19:11 682Android系统的Binder机制之一—— ... -
android中修改framework层代码后怎样操作才能看到修改后的效果?
2012-03-30 10:24 40121.下面方法适合真机:下载android源码,然后编译你修改的 ... -
Ubuntu下常用的快捷键
2012-03-19 09:10 0最常用 win+n切换背景颜色风格 alt+tab=不用说了 ... -
Android中全屏无标题设置
2012-03-06 10:29 2345方法一:在java代码中实现 //取消标题 ... -
如何通过wifi调试android程序
2012-03-06 09:53 3294android手机居然可以通过wifi进行程序的调试,太好 ... -
长按home键显示当前任务
2012-03-05 10:33 6287公司给我的任务就是怎么长按home键显示当前任务,刚开始我还以 ... -
android捕获Home键的方法
2012-03-05 10:08 2363Level5以上(包含)中,Activity类中有如下方法: ... -
在32位Ubuntu10.04上编译Android2.3
2012-02-18 11:23 01.安装JDK6 对于Android2.3系统,不要安 ... -
滑动按钮
2012-02-10 19:09 675http://blog.csdn.net/luoyuhhy/a ... -
Android 支持多屏幕机制
2012-02-10 09:20 647在Android上进行开发, ... -
Android UI开发专题
2012-02-06 09:36 857Android UI开发专题 (一) ... -
Launcher(一)关于使用Eclipse调试Launcher的完美解决方法
2012-02-02 19:21 1231由于在Android源码中,很多方法、成员、类、包都被打上@h ... -
android Launcher——ui框架
2012-01-31 22:25 1050android Launcher——ui框架 分 ... -
为程序员量身定制的12个目标
2012-01-15 15:01 582ugmbbc发布于 2012-01-15 ... -
Ubuntu Linux中连接Android真机调试
2012-01-14 14:50 1161首先确保用数据线链接后能识别设备,输入:lsusb,可以看 ... -
如何成为一名Android开发高手
2012-01-04 16:42 1791下面是成为一名真正的Android高手必须掌握和遵循的一些准则 ... -
android GestureDetector功能和使用
2011-12-26 15:36 832android为了增加用户体验 ... -
Android 系统自带样式Android:theme
2011-12-26 15:23 749•android:theme="@android: ...
相关推荐
一个自定义控件继承自ScrollView,下拉时header会放大松开后会恢复原状,上滑时header会被下面的内容吃掉盖住而且会稍稍往上滑,在header高度范围内滑动时导航栏背景和导航栏的按钮会反向改变透明度形成一种对比效果。
滑动按钮,自定义控件,自定义按钮,状态监听.java
基于Qt实现炫酷的自定义控件包括单选/多选/登录/进度条/编辑框/滑动条/按钮等+源码+项目说明,适合期末大作业、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Qt实现炫酷的...
UITableViewCell左右滑动出现更多按钮,按钮高度自定义
带关闭按钮可自定义样式的wpf tabcontrol控件,前景样式,背景样式都可以设定,打开的tab超过控件宽度后有左右箭头按钮可以左右滑动,使用非常方便,适合初学者参考和学习。
自己用WPF的XAML语言写的一个类似于苹果手机上的滑动按钮的开关,可以直接使用,程序比较简单易懂,没有任何生涩的引用,涉及WPF的资源定义,控件布局,模板自定义,事件触发,动画实现等基本知识,只是新手学习如何...
Android 仿 iPhone 自定义滑动按钮
android控件研究,自定义滑动按钮,有注释
本文实例为大家分享了Android自定义实现可滑动按钮的具体代码,供大家参考,具体内容如下 实现逻辑 1.创建一个类继承view类,实现里面的onMeasure() onDraw()方法 2.在 onMeasure() 中需要调用setMeasuredDimension...
Android自定义View 滑动开关按钮的实现 ,使用到自定义属性方式,可以下载学习参考。
一个可以点击左边或者滑动进行关,右边点击或滑动进行开的自定义控件。图片资源一并带有,下下来就可以使用。很方便
用开源项目SwitchButton实现各种风格的switch,开始接触开关样式的按钮是在IOS系统上面,它的切换以及滑动十分帅气,深入人心。 所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按钮效果。 ...
主要为大家详细介绍了Android自定义控件实现按钮滚动选择效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android自定义开关按钮(滑动,点击(方法中已经提供,需自我实现))
②一张为控制开和关的滑动按钮 第一步: 写个类继承View,并重写几个方法: 第一个为构造函数,重写一个参数的函数和两个参数的函数就够了,因为两个参数的函数能够使用自定义属性 第二个为控制控件的大小–>...
处理滑动事件 提供一些接口方法 实现方法 初始化一些参数 public class TempControlView extends View { // 控件宽 private int width; // 控件高 private int height; // 刻度盘半径 private int ...
android自定义控件,在一个页面中显示图片按钮的倒影和余影,并配有文字说明。可以在有限的空间内实现控件的滑动。
-- 滑动解锁控件 xml配置属性 --> <attr name=slideImageViewWidth format=dimension/><!-- 滑块宽度 --> <attr name=slideImageViewResId format=reference/><!-- 滑块资源id --> <attr name...
重写CompoundButton控件实现带滑动效果的开关按钮: 重写CompuundButton的实现可能会显得相对繁琐些,主要是考虑状态是否已经选中等情况的文字显示。 可以查看官方文档,之后继承CompuundButton,在布局的动画和...