- 浏览: 270942 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
tonytony3:
THANK YOU
Android多级树形菜单的实现 -
haiyang08101:
deleteNumber = "421f481e-7 ...
java对xml文件做增删改查 -
求求你帮帮我:
怎么把我的空格也当成节点处理了?
java对xml文件做增删改查 -
求求你帮帮我:
deleteNumber = "421f481e-7 ...
java对xml文件做增删改查 -
lpj13579:
多谢分享,学习学习
高仿小米盒子UI效果实现
自定义View的常用方法:
onFinishInflate() 当View中所有的子控件均被映射成xml后触发
onMeasure(int, int) 确定所有子元素的大小
onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发
onSizeChanged(int, int, int, int) 当view的大小发生变化时触发
onDraw(Canvas) view渲染内容的细节
onKeyDown(int, KeyEvent) 有按键按下后触发
onKeyUp(int, KeyEvent) 有按键按下后弹起时触发
onTrackballEvent(MotionEvent) 轨迹球事件
onTouchEvent(MotionEvent) 触屏事件
onFocusChanged(boolean, int, Rect) 当View获取或失去焦点时触发
onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发
onAttachedToWindow() 当view被附着到一个窗口时触发
onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和 onAttachedToWindow() 是相反的。
onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发
public class cwjView extends View { public cwjView(Context context) { super(context); setFocusable(true); //允许获得焦点 setFocusableInTouchMode(true); //获取焦点时允许触控 } @Override protected Parcelable onSaveInstanceState() { //处理窗口保存事件 Parcelable pSaved = super.onSaveInstanceState(); Bundle bundle = new Bundle(); //dosomething return bundle; } @Override protected void onRestoreInstanceState(Parcelable state) { //处理窗口还原事件 Bundle bundle = (Bundle) state; //dosomething super.onRestoreInstanceState(bundle.getParcelable("cwj")); return; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) //处理窗口大小变化事件 { super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //如果不让父类处理记住调用setMeasuredDimension } @Override protected void onLayout (boolean changed, int left, int top, int right, int bottom) { super.onLayout (changed,left,top, ight,bottom) ; } @Override protected void onDraw(Canvas canvas) { Paint bg = new Paint(); bg.setColor(Color.Red); canvas.drawRect(0, 0, getWidth()/2, getHeight()/2, bg); //将view的左上角四分之一填充为红色 } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); //让父类处理屏幕触控事件 } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //处理按键事件,响应的轨迹球事件为 public boolean onTrackballEvent (MotionEvent event) switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: break; case KeyEvent.KEYCODE_DPAD_DOWN: break; case KeyEvent.KEYCODE_DPAD_LEFT: break; case KeyEvent.KEYCODE_DPAD_RIGHT: break; case KeyEvent.KEYCODE_DPAD_CENTER: //处理中键按下 break; default: return super.onKeyDown(keyCode, event); } return true; } } public class cwjView extends View { public cwjView(Context context) { super(context); setFocusable(true); //允许获得焦点 setFocusableInTouchMode(true); //获取焦点时允许触控 } @Override protected Parcelable onSaveInstanceState() { //处理窗口保存事件 Parcelable pSaved = super.onSaveInstanceState(); Bundle bundle = new Bundle(); //dosomething return bundle; } @Override protected void onRestoreInstanceState(Parcelable state) { //处理窗口还原事件 Bundle bundle = (Bundle) state; //dosomething super.onRestoreInstanceState(bundle.getParcelable("cwj")); return; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) //处理窗口大小变化事件 { super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //如果不让父类处理记住调用setMeasuredDimension } @Override protected void onLayout (boolean changed, int left, int top, int right, int bottom) { super.onLayout (changed,left,top, ight,bottom) ; } @Override protected void onDraw(Canvas canvas) { Paint bg = new Paint(); bg.setColor(Color.Red); canvas.drawRect(0, 0, getWidth()/2, getHeight()/2, bg); //将view的左上角四分之一填充为红色 } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); //让父类处理屏幕触控事件 } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //处理按键事件,响应的轨迹球事件为 public boolean onTrackballEvent (MotionEvent event) switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: break; case KeyEvent.KEYCODE_DPAD_DOWN: break; case KeyEvent.KEYCODE_DPAD_LEFT: break; case KeyEvent.KEYCODE_DPAD_RIGHT: break; case KeyEvent.KEYCODE_DPAD_CENTER: //处理中键按下 break; default: return super.onKeyDown(keyCode, event); } return true; } }
以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的:
@Override protected void onDraw(Canvas canvas) { //这里我们直接使用canvas对象处理当前的画布,比如说使用Paint来选择要填充的颜色 Paint paintBackground = new Paint(); paintBackground.setColor(getResources().getColor(R.color.xxx)); //从Res中找到名为xxx的color颜色定义 canvas.drawRect(0, 0, getWidth(), getHeight(), paintBackground); //设置当前画布的背景颜色为paintBackground中定义的颜色,以0,0作为为起点,以当前画布的宽度和高度为重点即整块画布来填充,具体的请查看Android123未来讲到的Canvas和Paint,在Canvas中我们可以实现画路径,图形,区域,线。而Paint作为绘画方式的对象可以设置颜色,大小,甚至字体的类型等等。 }
当然还有就是处理窗口还原状态问题(一般用于横竖屏切换),除了在Activity中可以调用外,开发游戏时我们尽量在View中使用类似
@Override protected Parcelable onSaveInstanceState() { Parcelable p = super.onSaveInstanceState(); Bundle bundle = new Bundle(); bundle.putInt("x", pX); bundle.putInt("y", pY); bundle.putParcelable("android123_state", p); return bundle; } @Override protected void onRestoreInstanceState(Parcelable state) { Bundle bundle = (Bundle) state; dosomething(bundle.getInt("x"), bundle.getInt("y")); //获取刚才存储的x和y信息 super.onRestoreInstanceState(bundle.getParcelable("android123_state")); return; }
发表评论
-
Android 三大图片加载框架比较
2016-11-30 10:31 10781.哪三大图片加载框架? 1) Pi ... -
仿微信小视屏拍摄的进度条/自定义的progressBar的样式。
2016-08-20 00:25 1020今天有个需求,就是需要倒计时的进度条,样式参考微信小视屏拍摄 ... -
android 闹钟定时任务 AlarmManager
2016-06-02 13:41 1821直接上代码 package com.exampl ... -
android应用实现重启系统
2016-06-02 13:33 35121.在AndroidManifest.xml文件的manif ... -
android 每天定时提醒功能实现
2016-06-01 22:42 0android要实现定时的功 ... -
Java Calendar 类的时间操作
2016-06-01 21:02 661ava Calendar 类时间操作,这也许是创建日历和管理 ... -
android中fragment和activity之间相互通信
2014-11-13 16:25 1433在用到fragment的时候,老是会遇到一个问题,就是fra ... -
墨迹天气上下滑动viewpager
2014-11-04 17:15 742墨迹天气上下滑动viewpager -
Android杂谈--打开文件的Intent及使用
2014-10-25 13:03 639在写文件管理系统时会用到各种打开不同格式的文件的需求,由于A ... -
获取Android签名证书的sha1值
2014-08-23 23:14 657前言:今天开始研 ... -
java中Keytool的使用总结
2014-08-23 22:40 557J2SDK提供了keytool命令行工具,可以根据指定的参数 ... -
android获取versionName和versionCode
2014-07-08 18:02 733<TextView android:textSize= ... -
Android如何防止apk程序被反编译
2014-07-08 17:22 703作为Android应用开发者,不得不面对一个尴尬的局面,就是 ... -
在GridView中实现单选或多选功能
2014-06-26 13:08 816由于项目需要,要用到GridView实现多选功能,在网上搜 ... -
Android中Tween动画和Frame动画实例
2014-06-26 10:46 721Animation主要有两种动画模式:Tween动画和Fra ... -
android 禁用和开启四大组件的方法(setComponentEnabledSetting )
2014-06-19 15:26 0为什么要关闭组件? 在用到组件时,有时候我们可能暂时性的不使 ... -
android MD5校验码的生成与算法实现
2014-06-17 10:58 880在Java中,java.security.Mes ... -
android 自动检测版本升级
2014-06-15 14:10 382这里我用别的app代替了,简单省事,正常的话,你要对你的 ... -
layout左右平滑控制.
2014-04-30 09:41 608<?xml version="1.0&quo ... -
android让你的TabHost滑动起来
2014-04-22 22:13 815在Android应用中,一般TabActivity和若干个T ...
相关推荐
android开发中常用的工具类和自定义viewandroid开发中常用的工具类和自定义viewandroid开发中常用的工具类和自定义viewandroid开发中常用的工具类和自定义viewandroid开发中常用的工具类和自定义viewandroid开发中...
### Android自定义View从入门到高级 在Android开发过程中,自定义View是非常重要的一项技能,它可以帮助开发者实现更加丰富的UI效果以及更为灵活的功能定制。本文将深入探讨Android自定义View的相关知识,包括基本...
在Android开发中,自定义View是一项常见的需求,它允许开发者根据特定的设计要求或者功能扩展来创建独特的用户界面组件。本文将深入探讨如何实现一个自定义的View,使其能够精确地绘制水平和垂直居中的文本,效果...
这种方法是最常用的方法,通过指定自定义View的类名和布局参数来实现自定义View的引用。在上面的代码中,我们指定了自定义View的类名为com.test.copytext.CopyText,并设置了其宽度和高度。 方法二:<view class=...
下面将详细介绍自定义View的基本步骤、核心概念以及常用技巧。 1. **创建自定义View** 创建自定义View通常需要继承自`View`类或其子类,如`Button`、`TextView`等。在Java代码中,我们可以通过重写构造函数、`...
3. **测量(Measure)**:重写`onMeasure()`方法,确定自定义View的尺寸。 4. **布局(Layout)**:重写`onLayout()`方法,安排子View的位置(如果继承自`ViewGroup`)。 5. **绘制(Draw)**:重写`onDraw()`方法,这是...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素。本教程将聚焦于如何创建一个简单的仿QQ音乐歌词颜色渐变的自定义View。这个功能在许多音乐播放应用中常见,它能为用户...
1. **绘制流程**:自定义View的核心在于重写`onDraw()`方法。在这个方法中,我们可以使用Canvas对象进行图形绘制,如线条、矩形、圆形等。Canvas提供了多种绘图API,如`drawRect()`, `drawCircle()`, `drawText()`等...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有创意的界面元素。这个开源项目“锯齿边框,类似优惠劵效果的自定义 View”提供了实现优惠券样式视图的方法,其核心是通过组合半圆锯齿...
SeekBar 是 Android 系统中一个非常常用的控件,它用于显示进度信息,通常用于音频、视频播放控制或者设置应用的参数。自定义 SeekBar 可以帮助开发者根据设计需求打造出独特且符合用户体验的界面元素。本文将深入...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建具有独特功能和视觉效果的组件。本项目标题“自定义View实现折线图动态添加功能”旨在教你如何构建一个能够实时动态更新数据的折线图表...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且具有交互性的用户界面元素。本主题将深入探讨如何实现一个自定义的环形Progress View,即"自定义View环形Progress"。 环形...
本篇文章将详细探讨如何通过自定义View来实现一个全屏滑动的DrawerLayout。 首先,了解DrawerLayout的基本结构和工作原理是至关重要的。DrawerLayout允许一个或两个“抽屉”从屏幕边缘滑出。这些抽屉通常包含导航...
1. **代码复用**:自定义View可以封装常用的功能,减少重复代码。 2. **性能优化**:由于控制权在开发者手中,可以根据需求进行性能优化,避免不必要的绘制和计算。 3. **增强用户体验**:自定义View可以提供独特的...
- `onMeasure()`:根据MeasureSpec计算并设定自定义View的尺寸,使用`setMeasuredDimension()`方法。 4. **事件处理** - `MotionEvent`:处理触摸事件,如ACTION_DOWN, ACTION_UP, ACTION_MOVE等。 - `...
在自定义View中不常用,但在某些场景下,如游戏或加载指示器,可能会用到。 为了响应触摸事件,我们需要重写`onTouchEvent()`方法,处理ACTION_DOWN、ACTION_UP、ACTION_MOVE等事件,实现拖动、点击等交互。 最后...
5. **布局管理**:如果你的自定义View包含多个子View(如每个字母项),可能需要重写`onLayout()`方法来合理安排子View的位置。 6. **数据绑定**:为了将数据(如字母列表)与视图关联,可以考虑使用数据绑定库,如...
在创建自定义View时,通常会重写以下几个关键方法: 1. **构造函数**:Android提供了几个构造函数供选择,其中`public CustomView(Context context)`和`public CustomView(Context context, AttributeSet attrs)`是...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面和交互体验。本主题将深入探讨如何在Android中实现一个自定义的画板(View)。我们将讨论核心概念、步骤以及关键代码片段,以...
接下来,我们引入了一个`DisplayUtil`类,它是一些常用的转换方法,用于将像素单位(px)转换为设备独立像素(dp)或文字缩放像素(sp)。这些方法在处理尺寸时非常有用,确保在不同分辨率和密度的设备上保持一致的视觉...