- 浏览: 206681 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
xyyx_nk:
在demo中没有下载的示例,能详细说一下怎么监听下载过程吗?比 ...
DhNet 网络http工具(带缓存功能哦) -dhroid文档 -
zhaoguowei998:
dhroid ioc模块对 加密混淆问题 -
zhaoguowei998:
你太牛了,佩服佩服,以后要多想你请教了
dhroid ioc模块对 加密混淆问题 -
白色蜻蜓:
转载下您的文章,已注明出处。
IOS开发之百度地图API应用 -
wenjiefeng:
你好,在andrioidpn-client客户端源码里,Not ...
Android 推送之原理与初触Androidpn(Android Push Notification)
记得在eoe上有人发过,但代码质量不好。我重写了一下,抽成了控件。但没有经过各种控件的相容性测试,如果和其他控件的相容性不好,就直接在activity中写代码吧,应该差不多的。
我用的是平板,所以效果还行,不知道手机如何。
代码:
- package com.ql.view;
- import android.R.anim;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.animation.Animation;
- import android.view.animation.RotateAnimation;
- import android.view.animation.ScaleAnimation;
- import android.view.animation.TranslateAnimation;
- import android.view.animation.Animation.AnimationListener;
- import android.widget.Button;
- import android.widget.RelativeLayout;
- import com.ql.app.R;
- public class AnimButtons extends RelativeLayout{
- private Context context;
- private int leftMargin=0,bottomMargin=0;
- private final int buttonWidth=58;//图片宽高
- private final int r=180;//半径
- private final int maxTimeSpent=200;//最长动画耗时
- private final int minTimeSpent=80;//最短动画耗时
- private int intervalTimeSpent;//每相邻2个的时间间隔
- private Button[] btns;
- private Button btn_menu;
- private RelativeLayout.LayoutParams params;
- private boolean isOpen = false;//是否菜单打开状态
- private float angle;//每个按钮之间的夹角
- public AnimButtons(Context context) {
- super(context);
- // TODO Auto-generated constructor stub
- this.context=context;
- }
- public AnimButtons(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- this.context=context;
- }
- @Override
- protected void onFinishInflate() {
- // TODO Auto-generated method stub
- super.onFinishInflate();
- View view=LayoutInflater.from(context).inflate(R.layout.anim_buttons, this);
- initButtons(view);
- }
- private void initButtons(View view){
- // TODO Auto-generated method stub
- //6个按钮,具体视情况而定
- btns=new Button[6];
- btns[0] = (Button) view.findViewById(R.id.btn_camera);
- btns[1] = (Button) view.findViewById(R.id.btn_with);
- btns[2] = (Button) view.findViewById(R.id.btn_place);
- btns[3] = (Button) view.findViewById(R.id.btn_music);
- btns[4] = (Button) view.findViewById(R.id.btn_thought);
- btns[5] = (Button) view.findViewById(R.id.btn_sleep);
- btn_menu = (Button) view.findViewById(R.id.btn_menu);
- leftMargin=((RelativeLayout.LayoutParams)(btn_menu.getLayoutParams())).leftMargin;
- bottomMargin=((RelativeLayout.LayoutParams)(btn_menu.getLayoutParams())).bottomMargin;
- for(int i=0;i<btns.length;i++){
- btns[i].setLayoutParams(btn_menu.getLayoutParams());//初始化的时候按钮都重合
- btns[i].setTag(String.valueOf(i));
- btns[i].setOnClickListener(clickListener);
- }
- intervalTimeSpent=(maxTimeSpent-minTimeSpent)/btns.length;//20
- angle=(float)Math.PI/(2*(btns.length-1));
- }
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- // TODO Auto-generated method stub
- super.onSizeChanged(w, h, oldw, oldh);
- final int bottomMargins=this.getMeasuredHeight()-buttonWidth-bottomMargin;
- // Log.i("tag", "bottomMargins====="+bottomMargins);
- btn_menu.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- if(!isOpen){
- isOpen = true;
- // btn_menu.startAnimation(animRotate(-45.0f, 0.5f, 0.45f));
- for(int i=0;i<btns.length;i++){
- float xLenth=(float)(r*Math.sin(i*angle));
- float yLenth=(float)(r*Math.cos(i*angle));
- // Log.i("tag", "xLenth======"+xLenth+",yLenth======"+yLenth);
- btns[i].startAnimation(animTranslate(xLenth, -yLenth, leftMargin+(int)xLenth, bottomMargins - (int)yLenth, btns[i], minTimeSpent+i*intervalTimeSpent));
- }
- }
- else{
- isOpen = false;
- // btn_menu.startAnimation(animRotate(90.0f, 0.5f, 0.45f));
- for(int i=0;i<btns.length;i++){
- float xLenth=(float)(r*Math.sin(i*angle));
- float yLenth=(float)(r*Math.cos(i*angle));
- // Log.i("tag", "xLenth======"+xLenth+",yLenth======"+yLenth);
- btns[i].startAnimation(animTranslate(-xLenth, yLenth, leftMargin, bottomMargins, btns[i], maxTimeSpent-i*intervalTimeSpent));
- }
- }
- }
- });
- }
- private Animation animScale(float toX, float toY){
- // TODO Auto-generated method stub
- Animation animation = new ScaleAnimation(1.0f, toX, 1.0f, toY, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
- animation.setInterpolator(context, anim.accelerate_decelerate_interpolator);
- animation.setDuration(400);
- animation.setFillAfter(false);
- return animation;
- }
- private Animation animRotate(float toDegrees, float pivotXValue, float pivotYValue){
- // TODO Auto-generated method stub
- final Animation animation = new RotateAnimation(0, toDegrees, Animation.RELATIVE_TO_SELF, pivotXValue, Animation.RELATIVE_TO_SELF, pivotYValue);
- animation.setAnimationListener(new AnimationListener(){
- @Override
- public void onAnimationStart(Animation animation){
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationRepeat(Animation animation){
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationEnd(Animation animation){
- // TODO Auto-generated method stub
- animation.setFillAfter(true);
- }
- });
- return animation;
- }
- private Animation animTranslate(float toX, float toY, final int lastX, final int lastY,
- final Button button, long durationMillis){
- // TODO Auto-generated method stub
- Animation animation = new TranslateAnimation(0, toX, 0, toY);
- animation.setAnimationListener(new AnimationListener(){
- @Override
- public void onAnimationStart(Animation animation){
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationEnd(Animation animation){
- // TODO Auto-generated method stub
- params = new RelativeLayout.LayoutParams(0, 0);
- params.height = buttonWidth;
- params.width = buttonWidth;
- params.setMargins(lastX, lastY, 0, 0);
- button.setLayoutParams(params);
- button.clearAnimation();
- }
- });
- animation.setDuration(durationMillis);
- return animation;
- }
- View.OnClickListener clickListener=new View.OnClickListener(){
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- int selectedItem=Integer.parseInt((String)v.getTag());
- for(int i=0;i<btns.length;i++){
- if(i==selectedItem){
- btns[i].startAnimation(animScale(2.0f, 2.0f));
- }else{
- btns[i].startAnimation(animScale(0.0f, 0.0f));
- }
- }
- if(onButtonClickListener!=null){
- onButtonClickListener.onButtonClick(v, selectedItem);
- }
- }
- };
- public boolean isOpen(){
- return isOpen;
- }
- private OnButtonClickListener onButtonClickListener;
- public interface OnButtonClickListener{
- void onButtonClick(View v,int id);
- }
- public void setOnButtonClickListener(OnButtonClickListener onButtonClickListener){
- this.onButtonClickListener=onButtonClickListener;
- }
- }
布局anim_buttons.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#FFF"
- >
- <Button android:id="@+id/btn_sleep"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/composer_sleep"
- android:layout_alignParentLeft="true"
- android:layout_alignParentBottom="true"
- />
- <Button android:id="@+id/btn_thought"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/composer_thought"
- android:layout_alignParentLeft="true"
- android:layout_alignParentBottom="true"
- />
- <Button android:id="@+id/btn_music"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/composer_music"
- android:layout_alignParentLeft="true"
- android:layout_alignParentBottom="true"
- />
- <Button android:id="@+id/btn_place"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/composer_place"
- android:layout_alignParentLeft="true"
- android:layout_alignParentBottom="true"
- />
- <Button android:id="@+id/btn_with"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/composer_with"
- android:layout_alignParentLeft="true"
- android:layout_alignParentBottom="true"
- />
- <Button android:id="@+id/btn_camera"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/composer_camera"
- android:layout_alignParentLeft="true"
- android:layout_alignParentBottom="true"
- />
- <Button android:id="@+id/btn_menu"
- android:layout_width="58dip"
- android:layout_height="58dip"
- android:background="@drawable/friends_delete"
- android:layout_alignParentLeft="true"
- android:layout_alignParentBottom="true"
- android:layout_marginLeft="10dip"
- android:layout_marginBottom="10dip"
- />
- </RelativeLayout>
用法:
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- AnimButtons animButtons=(AnimButtons)findViewById(R.id.animButtons);
- animButtons.setOnButtonClickListener(new AnimButtons.OnButtonClickListener() {
- @Override
- public void onButtonClick(View v, int id) {
- // TODO Auto-generated method stub
- Log.i("tag", "id============="+id);
- }
- });
- }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello" />
- <!-- layout_width,layout_height最好是fill_parent参数 -->
- <com.ql.view.AnimButtons
- android:id="@+id/animButtons"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- />
- </LinearLayout>
发表评论
-
Dhdb 简化sqlite数据库操作--dhroid文档
2014-04-15 12:30 1361android数据库其实使用的不多,dhroid框架中的 ... -
dhroid ioc模块对 加密混淆问题
2014-04-14 12:52 976大家应该已经看过ioc ... -
NetJSONAdapter 网络化的adapter(高效) -dhroid文档
2014-04-04 12:15 900关于adapter 我想对于大家来说已经不陌生了,基本应用 ... -
DhNet 网络http工具(带缓存功能哦) -dhroid文档
2014-03-24 13:36 1519网络请求是大多数应用不可获取的一部分,曾经和一个其他公司的 ... -
eventbus 事件总线-dhroid文档
2014-03-23 11:47 1272你听过onClick 事件,onItemClick 事件, ... -
ioc基础(视图,资源,assert注入)-dhroid文档
2014-03-21 12:59 870上一节 Android 极速开发框架 dhroid来了 ... -
ioc高级(接口,对象注入)-dhroid文档
2014-03-21 13:04 1143前一章 ioc基础( ... -
IOC容器详解(想晋升的进来)---dhroid框架教教程(一)
2014-03-20 10:30 984控制反转(Inversion of Control,英文缩写 ... -
Android 极速开发框架 dhroid来了(提供demo)
2014-03-19 17:24 1397我们公司内部使用的商业级android开发框架dhr ... -
HttpClient的3种超时说明
2013-03-14 11:05 890/* 从连接池中取连接的超时时间 */ConnManag ... -
MeasureSpec介绍及使用详解
2013-01-24 21:21 760一个MeasureSpec封装了父 ... -
Android使用自定义AlertDialog
2012-12-28 11:48 841Android使用自定义AlertDialog以下的代码是写在 ... -
Android学习——TextView 设置中划线 下划线
2012-10-31 14:42 3465android:textAppearance ... -
ListView与其中的Button,EditText,RatingBar等widget的click事件
2012-10-26 14:48 881在<RelativeLayout>中 an ... -
Android PNG渐变背景图片失真问题
2012-09-13 15:06 749最近一个困扰很久的问题,渐变效果的png图片,设置为控件 ... -
在线词典API
2012-09-09 19:34 753QQ词典 http://dict.qq.com/dic ... -
android Uri获取真实路径转换成File的方法
2012-08-23 12:40 3083data.getData()返回的 ... -
Java之WeakReference与SoftReference使用讲解
2012-08-22 09:46 694如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集 ... -
Android自定义捕获Application全局异常
2012-08-21 17:24 1219package qianlong.qlmobile ... -
android 缩放图片与内存溢出
2012-08-03 09:43 1233常用的Android版缩放图片代码: ContentRes ...
相关推荐
首先,`ArcMenu`项目是开发者`daCapricorn`在GitHub上开源的一个实现扇形菜单效果的工具。该项目提供了自定义菜单项和动画效果,使得开发者可以轻松地在自己的应用中集成扇形菜单。你可以通过访问项目链接查看源代码...
一款仿团购应用图片菜单效果的源码,目前已经实现了以下功能: 1.图片导航菜单展开(ExpandableListView) 2.子菜单滑动切换(ViewFlipper) 3.根据当前页面显示页标 还有两个问题,感兴趣的朋友可以研究下: 1...
总的来说,“仿Path菜单效果”是一种创新的Android菜单设计,它结合了动画和自定义参数,提升了用户体验。通过理解其背后的实现原理和代码结构,开发者可以掌握更多关于Android动画和自定义视图的知识,进一步提升...
此项目标题"转盘菜单效果 iOS 仿建行客户端"表明,我们将探讨如何在iOS应用程序中实现类似中国建设银行客户端中的旋转菜单功能。这种设计灵感来源于老式电话机的拨号盘,用户可以通过转动菜单来选择不同的功能或选项...
本文将详述如何实现“仿淘宝taobao商城类别菜单效果”,这是一个基于JavaScript(js)技术实现的动态菜单功能,旨在为用户提供清晰、直观且易用的导航体验。 淘宝商城的类别菜单以其层次分明、响应迅速的特点,深受...
本文将详细介绍如何使用`PopupWindow`在Android应用中模仿微信右上角的弹出菜单效果。 首先,我们需要理解`PopupWindow`的基本用法。`PopupWindow` 是一个可以在屏幕任意位置显示的窗口,它不依附于任何Activity,...
在Android开发中,"仿path菜单 控件版 可以修改位置和动画方向"是一个针对用户界面设计的组件,主要用于创建一种独特的交互式菜单效果。这个菜单灵感来源于PATH社交应用,因此被称为PATH菜单或者卫星菜单。它通常在...
"仿苹果pathMenu菜单效果"是一个这样的设计,它旨在模仿苹果操作系统(如macOS)中的下拉菜单功能,这种菜单在用户交互时提供了简洁且直观的导航方式。下面将详细解释这个效果涉及的技术点和实现方法。 首先,`path...
标题提到的"仿google的导航菜单效果",指的是创建一个与Google网站相似的顶部导航菜单,这种菜单以其简洁、直观和高效的特性广受用户喜爱。让我们深入探讨一下这个话题。 首先,导航菜单是网页设计的核心元素之一,...
综上所述,实现仿QQ下拉菜单效果涉及了CSS来设计样式,HTML来构建菜单结构,JavaScript来实现动态交互。通过分析这些文件,我们可以学习到如何使用这些技术来创建一个具有类似QQ应用的下拉菜单,提升用户体验。
在本项目中,我们主要探讨的是如何利用JavaScript和CSS3技术来实现仿MacOS苹果系统底部图标菜单的动画效果。这种效果通常出现在苹果操作系统的Dock栏上,它为用户提供了一种直观且美观的界面交互方式。下面将详细...
本文将深入探讨如何实现一个仿网易新闻安卓端菜单栏动画,这是Android动画系列的第二部分。通过这个实战案例,开发者可以了解到如何利用Android的动画API来创建复杂的交互式效果,增强应用的视觉吸引力。 首先,...
4. **状态管理**:为了确保用户在任何时刻都能准确感知菜单的状态(打开或关闭),开发者需要维护一个标志来追踪当前状态,并根据此状态更新视图。 5. **性能优化**:在处理滑动时,要确保动画流畅,避免过度绘制和...
"iOS 仿建行转盘菜单"项目就是一个很好的例子,它展示了如何模仿建设银行应用中的圆形转盘菜单。这种菜单设计不仅美观,而且交互性强,能吸引用户的注意力并提供直观的操作方式。接下来,我们将深入探讨实现这样一个...
本教程将深入探讨如何实现"android仿path菜单效果",这是一个利用布局和TranslateAnimation来创建类似PATH应用的菜单动画效果。PATH,一款知名的社交网络应用,以其独特的界面设计获得了用户的喜爱,特别是其菜单...
在安卓应用开发中,创建一个吸引用户的界面设计是至关重要的,而印象笔记的抽屉菜单效果就是一个很好的例子。抽屉菜单通常被用作隐藏主菜单或设置选项,它以一种优雅的方式从屏幕边缘滑出,提供了良好的用户体验。...
总结起来,"仿Path加号效果菜单"是一种增强用户交互体验的设计,通过动画技术和Android的视图组件,可以实现一个动态展开的菜单效果。实现过程中涉及到了Android的动画系统、布局设计、事件监听、资源管理和性能优化...
【标题】"仿path动画菜单lib.zip"是一个与Android开发相关的资源包,它包含了一个用于创建具有路径动画效果的菜单的源代码库。这个库可能是为Android应用开发者设计的,帮助他们在自己的应用中实现吸引人的、动态的...
总的来说,实现"仿QQ6.0侧滑菜单效果"需要对Android的触摸事件处理、手势检测、布局管理以及动画设计有深入理解。通过合理地组合使用各种Android组件和API,开发者可以创建出与QQ6.0类似的、具有优秀用户体验的侧滑...