- 浏览: 117807 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
瘾心丶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 711AIDL的作用 由于每 ... -
Android的系统的Binder机制(一)
2012-06-21 19:11 659Android系统的Binder机制之一—— ... -
Android的系统的Binder机制(一)
2012-06-21 19:11 758Android系统的Binder机制之一—— ... -
android中修改framework层代码后怎样操作才能看到修改后的效果?
2012-03-30 10:24 40921.下面方法适合真机:下载android源码,然后编译你修改的 ... -
Ubuntu下常用的快捷键
2012-03-19 09:10 0最常用 win+n切换背景颜色风格 alt+tab=不用说了 ... -
Android中全屏无标题设置
2012-03-06 10:29 2375方法一:在java代码中实现 //取消标题 ... -
如何通过wifi调试android程序
2012-03-06 09:53 3328android手机居然可以通过wifi进行程序的调试,太好 ... -
长按home键显示当前任务
2012-03-05 10:33 6348公司给我的任务就是怎么长按home键显示当前任务,刚开始我还以 ... -
android捕获Home键的方法
2012-03-05 10:08 2400Level5以上(包含)中,Activity类中有如下方法: ... -
在32位Ubuntu10.04上编译Android2.3
2012-02-18 11:23 01.安装JDK6 对于Android2.3系统,不要安 ... -
滑动按钮
2012-02-10 19:09 716http://blog.csdn.net/luoyuhhy/a ... -
Android 支持多屏幕机制
2012-02-10 09:20 678在Android上进行开发, ... -
Android UI开发专题
2012-02-06 09:36 910Android UI开发专题 (一) ... -
Launcher(一)关于使用Eclipse调试Launcher的完美解决方法
2012-02-02 19:21 1258由于在Android源码中,很多方法、成员、类、包都被打上@h ... -
android Launcher——ui框架
2012-01-31 22:25 1116android Launcher——ui框架 分 ... -
为程序员量身定制的12个目标
2012-01-15 15:01 618ugmbbc发布于 2012-01-15 ... -
Ubuntu Linux中连接Android真机调试
2012-01-14 14:50 1196首先确保用数据线链接后能识别设备,输入:lsusb,可以看 ... -
如何成为一名Android开发高手
2012-01-04 16:42 1850下面是成为一名真正的Android高手必须掌握和遵循的一些准则 ... -
android GestureDetector功能和使用
2011-12-26 15:36 871android为了增加用户体验 ... -
Android 系统自带样式Android:theme
2011-12-26 15:23 809•android:theme="@android: ...
相关推荐
"Android自定义控件-温度控制旋转按钮.zip"是一个专为实现温度调节功能而设计的自定义控件示例。这个控件模拟了一个可以旋转的按钮,用户通过旋转来调整温度值,常见于空调或加热系统的用户界面中。 首先,`...
本资源“C#自定义控件--Popup窗口提醒完整源码2019”提供了一个关于如何在C#中创建自定义控件,特别是实现Popup窗口提醒功能的示例代码。 Popup窗口在许多应用中都有广泛的应用,如提示信息、警告信息或菜单项的...
综上所述,"C#自定义控件--Popup窗口提醒完整源码"涉及了C#编程中的面向对象设计、用户界面设计、事件处理、动画实现等多个重要知识点,是一个综合性的编程实践案例。通过深入学习和理解这部分源码,开发者可以提升...
"Android高级应用源码-android自定义控件-侧滑菜单.rar"这个压缩包文件提供了一个关于如何在Android应用程序中实现自定义侧滑菜单的示例源代码。侧滑菜单是一种常见的UI设计模式,通常用于在主屏幕和辅助功能之间...
本压缩包“C#自定义控件--Popup窗口提醒完整源码__(0521).rar”提供了一个具体的实例,展示了如何在C#环境中实现一个Popup窗口提醒控件。Popup窗口通常用于显示临时通知、提示信息或用户操作反馈,它可以在用户界面...
为了实现独特的交互效果或视觉样式,开发者需要创建自定义控件来扩展系统的功能。 2. **自定义控件的类型**: - **视图(View)类派生**:直接继承自View类,适用于创建简单的图形或交互元素。 - **视图组...
在Android应用开发中,自定义控件是提升用户体验和实现独特设计的重要手段。侧滑菜单,也称为抽屉式导航,是一种常见的UI设计模式,它允许用户从屏幕边缘滑动以显示附加的操作或导航选项。在本文中,我们将深入探讨...
3. **实例应用**:在"Android屏幕自适应Demo"中,可能包含了一些自定义控件的实现,例如自定义按钮、滑动条或者其他具有特殊功能的视图。开发者可以通过查看源代码学习如何实现这些控件。 二、屏幕自适应 1. **...
【Android自定义控件】在Android开发中,自定义控件是实现个性化界面和功能扩展的重要手段。HoloEverywhere项目是针对Android平台的一个库,它使得开发者可以在Android 2.1及以上版本的设备上使用Android 4.0(Ice ...
一个自定义控件继承自ScrollView,下拉时header会放大松开后会恢复原状,上滑时header会被下面的内容吃掉盖住而且会稍稍往上滑,在header高度范围内滑动时导航栏背景和导航栏的按钮会反向改变透明度形成一种对比效果。
自定义控件是WinForms中实现个性化UI的关键。你可以通过继承现有的控件,如Button、Label等,然后重写绘制方法,添加额外的功能或改变其显示样式。例如,你可以创建一个圆角按钮或者带有渐变色背景的文本框。 2. *...
3. **绘制逻辑**:自定义控件往往需要重写`onDraw()`方法来实现自己的绘图逻辑。在这个练习中,可能包括了修改按钮的形状、添加自定义边框、更改默认的按下效果等。 4. **属性动画**:为了提供更丰富的交互体验,...
3. 自定义开关按钮:可能实现了风格独特的开关按钮,如滑动式开关或圆形开关。 4. 自定义下拉刷新控件:类似于SwipeRefreshLayout,但可能增加了更多的动画效果或者交互方式。 5. 自定义布局:例如瀑布流布局,...
本篇文章将详细讲解如何在Android中通过自定义控件来实现ListView的滑动删除功能。 首先,我们需要了解ListView的基本工作原理。ListView利用Adapter来绑定数据源,并通过ViewHolder优化性能,减少视图复用时的...
在C#编程中,自定义控件是一种非常重要的技术,它允许开发者根据特定需求扩展或创建新的用户界面元素。自定义控件可以是现有控件的简单修改,也可以是完全新颖的设计,为应用程序提供独特的交互体验。在这个实例中,...
自定义控件可以是简单的样式修改,如改变按钮的颜色和形状,也可以是复杂的交互设计,如自定义滑动选择器或动画效果。实现自定义控件通常涉及以下步骤: 1. 继承已存在的View类(如Button、TextView等)或 ...
自定义控件通常通过继承已有的View或ViewGroup类来实现。例如,如果你想要创建一个自定义按钮,你可以从Button类继承。首先,你需要创建一个新的Java类,并实现`onDraw()`方法,这是自定义控件绘制的核心。在`...
在Android应用开发中,自定义控件是一种常见的需求,它能帮助开发者实现独特且符合特定需求的用户界面。本文将深入探讨如何开发一个自定义的浮动工具条,这是一个在许多移动应用中都能见到的交互元素,它通常包含一...