- 浏览: 63777 次
- 性别:
- 来自: 湖南
最新评论
-
Neacy_Zz:
有些Android也可以显示的出来。
Android 将一张CMYK模式的图片转换成RGB模式的图片 -
hold_on:
AsyncTask 2.3 和 4.0稍有不同
Android从零开始(十五)
一个乐动力的刷新动画
源码下载戳这里:
package com.example.ledonglidemo; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.AttributeSet; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.widget.ImageView; public class GuideView extends ViewGroup { /** * 左边的图片 */ private ImageView left; /** * 右边的图片 */ private ImageView right; /** * 上面的图片 */ private ImageView top; /** * 下面的图片 */ private ImageView bottom; /** * 中间的图片 m */ private ImageView center; /** * 屏幕的宽度 */ private int screenW; /** * 屏幕的高度 */ private int screenH; public GuideView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } public GuideView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public GuideView(Context context) { super(context); init(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); } private List<Bitmap> bitmaps = new ArrayList<Bitmap>(); private void init(Context context) { left = new ImageView(context); left.setImageBitmap(BitmapFactory.decodeResource( context.getResources(), R.drawable.day)); bitmaps.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.day)); right = new ImageView(context); right.setImageBitmap(BitmapFactory.decodeResource( context.getResources(), R.drawable.night)); bitmaps.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.night)); top = new ImageView(context); top.setImageBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.up)); bitmaps.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.up)); bottom = new ImageView(context); bottom.setImageBitmap(BitmapFactory.decodeResource( context.getResources(), R.drawable.down)); bitmaps.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.down)); center = new ImageView(context); center.setImageBitmap(BitmapFactory.decodeResource( context.getResources(), R.drawable.animation_battery)); bitmaps.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.animation_battery)); screenW = ((Activity) context).getWindowManager().getDefaultDisplay() .getWidth(); screenH = ((Activity) context).getWindowManager().getDefaultDisplay() .getHeight(); this.addView(center); this.addView(left); this.addView(right); this.addView(top); this.addView(bottom); } private LinearInterpolator interpolator = new LinearInterpolator(); @Override protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { // TODO Auto-generated method stub // 五个控件的布局 center.layout(screenW / 2 - bitmaps.get(4).getWidth() / 2, screenH / 2 - bitmaps.get(4).getHeight() / 2, screenW / 2 + bitmaps.get(4).getWidth() / 2, screenH / 2 + bitmaps.get(4).getHeight() / 2); top.layout(screenW / 2 - bitmaps.get(2).getWidth() / 2, screenH / 2 - bitmaps.get(4).getHeight() / 2 - bitmaps.get(2).getHeight() + bitmaps.get(2).getWidth() / 2 / 4, screenW / 2 + bitmaps.get(2).getWidth() / 2, screenH / 2 - bitmaps.get(4).getHeight() / 2 + bitmaps.get(2).getWidth() / 2 / 4); left.layout(screenW / 2 - bitmaps.get(0).getWidth() * 2 - bitmaps.get(0).getWidth() / 4, screenH / 2 - bitmaps.get(0).getHeight() / 2, screenW / 2 - bitmaps.get(0).getWidth() - bitmaps.get(0).getWidth() / 4, screenH / 2 + bitmaps.get(0).getHeight() / 2); right.layout(screenW / 2 + bitmaps.get(1).getWidth() + bitmaps.get(1).getHeight() / 4, screenH / 2 - bitmaps.get(1).getHeight() / 2, screenW / 2 + bitmaps.get(1).getWidth() * 2 + bitmaps.get(1).getHeight() / 4, screenH / 2 + bitmaps.get(1).getHeight() / 2); bottom.layout(screenW / 2 - bitmaps.get(3).getWidth() / 2, screenH / 2 + bitmaps.get(4).getHeight() / 2 - bitmaps.get(3).getWidth() / 2 / 4, screenW / 2 + bitmaps.get(3).getWidth() / 2, screenH / 2 + bitmaps.get(4).getHeight() / 2 + bitmaps.get(3).getHeight() - bitmaps.get(3).getWidth() / 2 / 4); playCenter(); playTop(); playBottom(); playLeft(); playRight(); } /** * 右边的动画 */ private void playRight() { // 混合动画 AnimationSet animationSet = new AnimationSet(false); RotateAnimation rotateRight = new RotateAnimation(0, 359, Animation.ABSOLUTE, screenW / 2 - right.getLeft(), Animation.ABSOLUTE, (right.getBottom() - right.getTop()) / 2); RotateAnimation rotateSelf = new RotateAnimation(0, -359, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); // 播放时间 rotateSelf.setDuration(10 * 1000); // 播放加速的模式 rotateSelf.setInterpolator(interpolator); // 设置无限循环 rotateSelf.setRepeatCount(-1); rotateRight.setDuration(10 * 1000); rotateRight.setRepeatCount(-1); rotateRight.setInterpolator(interpolator); animationSet.addAnimation(rotateSelf); animationSet.addAnimation(rotateRight); // 播放混合动画 right.startAnimation(animationSet); } /** * 左边的动画 */ private void playLeft() { AnimationSet animationSet = new AnimationSet(false); RotateAnimation rotateLeft = new RotateAnimation(0, 359, Animation.ABSOLUTE, screenW / 2 - left.getLeft(), Animation.ABSOLUTE, (left.getBottom() - left.getTop()) / 2); rotateLeft.setDuration(10 * 1000); rotateLeft.setInterpolator(interpolator); rotateLeft.setRepeatCount(-1); RotateAnimation rotateSelf = new RotateAnimation(0, -359, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotateSelf.setDuration(10 * 1000); rotateSelf.setRepeatCount(-1); rotateSelf.setInterpolator(interpolator); animationSet.addAnimation(rotateSelf); animationSet.addAnimation(rotateLeft); left.startAnimation(animationSet); } /** * 下面的动画 */ private void playBottom() { RotateAnimation rotateBottom = new RotateAnimation(0, 359, Animation.RELATIVE_TO_SELF, 0.5f, Animation.ABSOLUTE, screenH / 2 - bottom.getTop()); rotateBottom.setDuration(10 * 1000); rotateBottom.setInterpolator(interpolator); rotateBottom.setRepeatCount(-1); bottom.startAnimation(rotateBottom); } /** * 上面的动画 */ private void playTop() { RotateAnimation rotateAnimation = new RotateAnimation(0, 359, Animation.ABSOLUTE, screenW / 2 - top.getLeft(), Animation.ABSOLUTE, screenH / 2 - top.getTop()); rotateAnimation.setDuration(10 * 1000); rotateAnimation.setInterpolator(interpolator); rotateAnimation.setRepeatCount(-1); top.startAnimation(rotateAnimation); } /** * 中间的View动画播放 */ private void playCenter() { AnimationSet animationSet = new AnimationSet(false); ScaleAnimation scaleSmall = new ScaleAnimation(1.0f, 0.6f, 1.0f, 0.6f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); ScaleAnimation scaleBig = new ScaleAnimation(1.0f, 5.0f / 3, 1.0f, 5.0f / 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scaleBig.setDuration(2 * 1000); scaleBig.setInterpolator(interpolator); scaleSmall.setDuration(2 * 1000); scaleSmall.setStartOffset(2 * 1000); scaleSmall.setRepeatCount(-1); scaleSmall.setFillEnabled(true); scaleSmall.setFillAfter(true); scaleBig.setStartOffset(2 * 1000); scaleBig.setRepeatCount(-1); scaleBig.setFillEnabled(true); scaleBig.setFillAfter(true); scaleSmall.setInterpolator(interpolator); animationSet.addAnimation(scaleBig); animationSet.addAnimation(scaleSmall); center.startAnimation(animationSet); } }
源码下载戳这里:
- GuideView.zip (42.3 KB)
- 下载次数: 4
发表评论
-
Android自定义控件--2(数字签名)
2014-02-26 11:08 973客户信息交互用到的一个数字签名,保存的是bmp图片(我那会在P ... -
Android自定义控件--1(TextView跑马灯效果)
2014-02-26 10:57 1589N久没有跟新了,最近 ... -
Android 将一张CMYK模式的图片转换成RGB模式的图片
2013-06-25 17:32 2310Android系统是不能够显示打印模式(CMYK)的图片的。所 ... -
Android TextToSpeech语音播放文本
2013-06-25 17:17 1902步骤一、初始化 package com.example.spe ... -
Android连接电脑eclipse无法识别=解决办法
2013-05-23 09:25 22221、方法一:“我的电脑”-->“属性”-->“设备 ... -
Android BaseAdapter如何获得每一项并添加按钮事件
2013-05-21 15:11 3769package com.hangcheng; impor ... -
Android的VideoView如何循环播放
2013-05-15 14:01 4862package com.hangcheng; impor ... -
Android如何获取asset目录下所有文件的路径
2013-05-15 09:48 7789package com.hangcheng.util; ... -
Android--WebView+HTML+Javascript
2013-04-09 17:17 1773知识点:android的WebView控件加载HTML并通过j ... -
VideoView重绘
2013-04-01 23:39 1383知识点:Android中的VideoView控件默认情况下是不 ... -
Android从零开始—多媒体(二十二)
2013-03-06 21:43 1064知识点:音乐播放、录音、播放视频、录像、拍照 步骤一、主界面 ... -
Android从零开始—监听广播BroadcastReceiver(二十一)
2013-03-05 10:17 2124知识点:电话拒接+短息 ... -
Android从零开始—电话+短信(二十)
2013-03-05 10:03 1162知识点:系统电话号码和短信的获取(最好用真机,模拟器上木有电话 ... -
Android从零开始(十九)
2013-02-27 10:35 1009知识点:back键的处理(有时候我们可能会不小心按了回退键,但 ... -
Android从零开始(十八)
2013-02-27 10:24 894知识点:菜单(menu) 步骤一、创建菜单项(核心代码如下) ... -
Android从零开始(十七)
2013-02-27 10:09 1018知识点:抽屉(SlidingDrawer) 先看一下抽屉打开 ... -
Android从零开始(十六)
2013-02-26 19:43 903知识点:闪屏(通常在 ... -
Android从零开始(十五)
2013-02-26 18:32 1149知识点:异步任务AsyncTa ... -
Android从零开始(十四)
2013-02-26 17:16 881知识点:TabHost选项卡之 ... -
Android从零开始(十三)
2013-02-23 22:57 867知识点:TabHost 效果图: 工程目录结构: ...
相关推荐
在Android开发中,"自定义控件-pulltorefresh"是一个常见的需求,指的是用户通过在屏幕顶部下拉来触发刷新操作的功能。这种交互模式在众多应用中被广泛使用,如新闻阅读、社交网络和电商应用等。"pulltorefresh"通常...
在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。本示例"自定义控件--点击随机数变换"由知名开发者鸿洋提供,旨在帮助开发者掌握如何创建并实现一个动态交互的自定义控件。在这个案例中,控件在...
这个压缩包“CustomViews”很可能是包含了一系列Android自定义控件的示例项目,旨在帮助开发者理解和学习如何在Android Studio 1.0.2环境下创建和使用自定义控件。 自定义控件通常涉及以下关键知识点: 1. **...
"Android自定义刷新控件"这个主题主要关注如何扩展谷歌提供的SwipeRefreshLayout,以实现上拉加载更多的功能。SwipeRefreshLayout通常用于下拉刷新,它是一个包含一个子视图的布局,当用户向下滑动时,可以触发刷新...
本资源“安卓自定义控件相关-Android自定义头部控件简单易用.rar”提供了关于创建自定义头部控件的示例,这在构建具有个性化的APP时非常有用。 标题中的“自定义头部控件”通常指的是在应用顶部显示的区域,如导航...
在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何实现一个自定义控件,以展示天气折线图的效果,包括天气图片和温度显示等功能。 首先,创建一个自定义View类,继承自...
在Android开发中,自定义控件是提升应用界面独特...通过学习和分析`customcontrols`中的代码,开发者可以深入理解Android自定义控件的工作原理,提高自己的Android开发技能,同时也能为今后的项目开发积累宝贵的经验。
总的来说,Android自定义控件的下拉刷新涉及到以下几个关键步骤: 1. 创建自定义布局,包含刷新指示器(如箭头和进度条)。 2. 在自定义视图中处理触摸事件,判断下拉手势并更新视图状态。 3. 触发刷新逻辑,加载新...
在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。本资源"安卓自定义控件相关-弹幕效果自定义View随机刷新数据.rar"聚焦于创建一个具有弹幕效果的自定义View,并能随机刷新显示的数据。在这个项目...
在Android开发中,自定义控件是提升应用个性化和功能扩展性的重要手段。"自定义控件 - (年+月+日+时+分+秒)"这个标题表明我们正在讨论如何创建一个显示完整时间(包括年、月、日、时、分、秒)的自定义控件。系统...
在Android开发中,自定义控件与特效是提升应用界面独特性和用户...以上是Android自定义控件与特效的一些核心概念和实践技巧,开发者通过深入理解和熟练运用这些知识点,能够创建出独具特色且功能丰富的Android应用。
总结来说,自定义Android刷新控件涉及到继承现有控件、重写关键方法、实现刷新动画、集成数据加载逻辑、提供可配置属性以及进行充分的测试。通过这样的步骤,我们可以创建出既满足功能需求又具有独特风格的自定义...
在Android开发中,自定义控件是提升应用用户体验和界面独特性的关键。本文将深入探讨如何创建一个自定义控件,用于根据麦克风输入的声音大小动态显示曲线图,并且该控件能响应触摸事件。我们将从以下几个方面进行...
"自定义控件练习Demo3-下拉刷新"是一个典型的Android开发实战案例,它涉及到如何创建一个可下拉刷新的ListView,这一功能在众多移动应用中非常常见,如新闻阅读、社交应用等。下面将详细介绍这个知识点。 首先,...
综上所述,创建一个Android自定义时钟控件是一个综合性的任务,涉及了Android UI编程、时间处理、动画和绘图等多个方面。通过学习和实践这个项目,开发者不仅可以提升自定义控件的技能,还能对Android系统有更深入的...
### Android自定义控件知识点详解 #### 一、Android控件基本介绍 Android平台提供了丰富的控件库,这些控件可以满足大多数应用界面设计的需求。然而,在某些情况下,开发人员可能需要创建自己的自定义控件以实现...
以上就是这个压缩包中可能涵盖的一些关键知识点,通过学习这些示例,开发者可以掌握Android自定义控件的设计技巧,提升应用程序的定制化水平和用户体验。每个示例都可以作为模板,根据实际需求进行修改和扩展,从而...
在Android开发中,自定义控件是提升应用界面独特性...对于想要深入学习Android自定义控件的开发者来说,这是一个很好的实践案例。通过阅读和分析源码,可以提升对Android视图机制的理解,为自己的项目增添更多可能性。
虽然这个压缩包中可能包含的代码示例可能需要调试和调整才能正常工作,但它们提供了一个很好的学习平台,可以帮助开发者深入理解Android自定义控件和动画的实现。通过分析和实践这些代码,你可以增强自己在Android...