package android.view.ext;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Provides a "Path" like menu for android. ??
*
* TODO: tell about usage
*
* @author Siyamed SINIR
*
*/
public class SatelliteMenu extends FrameLayout {
private static final int DEFAULT_SATELLITE_DISTANCE = 200;
private static final float DEFAULT_TOTAL_SPACING_DEGREES = 90f;
private static final boolean DEFAULT_CLOSE_ON_CLICK = true;
private static final int DEFAULT_EXPAND_DURATION = 400;
private Animation mainRotateRight;
private Animation mainRotateLeft;
private ImageView imgMain;
private SateliteClickedListener itemClickedListener;
private InternalSatelliteOnClickListener internalItemClickListener;
private List<SatelliteMenuItem> menuItems = new ArrayList<SatelliteMenuItem>();
private Map<View, SatelliteMenuItem> viewToItemMap = new HashMap<View, SatelliteMenuItem>();
private AtomicBoolean plusAnimationActive = new AtomicBoolean(false);
// ?? how to save/restore?
private IDegreeProvider gapDegreesProvider = new DefaultDegreeProvider();
//States of these variables are saved
private boolean rotated = false;
private int measureDiff = 0;
//States of these variables are saved - Also configured from XML
private float totalSpacingDegree = DEFAULT_TOTAL_SPACING_DEGREES;
private int satelliteDistance = DEFAULT_SATELLITE_DISTANCE;
private int expandDuration = DEFAULT_EXPAND_DURATION;
private boolean closeItemsOnClick = DEFAULT_CLOSE_ON_CLICK;
public SatelliteMenu(Context context) {
super(context);
init(context, null, 0);
}
public SatelliteMenu(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public SatelliteMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
LayoutInflater.from(context).inflate(R.layout.sat_main, this, true);
imgMain = (ImageView) findViewById(R.id.sat_main);
if(attrs != null){
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SatelliteMenu, defStyle, 0);
satelliteDistance = typedArray.getDimensionPixelSize(R.styleable.SatelliteMenu_satelliteDistance, DEFAULT_SATELLITE_DISTANCE);
totalSpacingDegree = typedArray.getFloat(R.styleable.SatelliteMenu_totalSpacingDegree, DEFAULT_TOTAL_SPACING_DEGREES);
closeItemsOnClick = typedArray.getBoolean(R.styleable.SatelliteMenu_closeOnClick, DEFAULT_CLOSE_ON_CLICK);
expandDuration = typedArray.getInt(R.styleable.SatelliteMenu_expandDuration, DEFAULT_EXPAND_DURATION);
//float satelliteDistance = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 170, getResources().getDisplayMetrics());
typedArray.recycle();
}
mainRotateLeft = SatelliteAnimationCreator.createMainButtonAnimation(context);
mainRotateRight = SatelliteAnimationCreator.createMainButtonInverseAnimation(context);
Animation.AnimationListener plusAnimationListener = new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
plusAnimationActive.set(false);
}
};
mainRotateLeft.setAnimationListener(plusAnimationListener);
mainRotateRight.setAnimationListener(plusAnimationListener);
imgMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SatelliteMenu.this.onClick();
}
});
internalItemClickListener = new InternalSatelliteOnClickListener(this);
}
private void onClick() {
if (plusAnimationActive.compareAndSet(false, true)) {
if (!rotated) {
imgMain.startAnimation(mainRotateLeft);
for (SatelliteMenuItem item : menuItems) {
item.getView().startAnimation(item.getOutAnimation());
}
} else {
imgMain.startAnimation(mainRotateRight);
for (SatelliteMenuItem item : menuItems) {
item.getView().startAnimation(item.getInAnimation());
}
}
rotated = !rotated;
}
}
private void openItems() {
if (plusAnimationActive.compareAndSet(false, true)) {
if (!rotated) {
imgMain.startAnimation(mainRotateLeft);
for (SatelliteMenuItem item : menuItems) {
item.getView().startAnimation(item.getOutAnimation());
}
}
rotated = !rotated;
}
}
private void closeItems() {
if (plusAnimationActive.compareAndSet(false, true)) {
if (rotated) {
imgMain.startAnimation(mainRotateRight);
for (SatelliteMenuItem item : menuItems) {
item.getView().startAnimation(item.getInAnimation());
}
}
rotated = !rotated;
}
}
public void addItems(List<SatelliteMenuItem> items) {
menuItems.addAll(items);
this.removeView(imgMain);
TextView tmpView = new TextView(getContext());
tmpView.setLayoutParams(new FrameLayout.LayoutParams(0, 0));
float[] degrees = getDegrees(menuItems.size());
int index = 0;
for (SatelliteMenuItem menuItem : menuItems) {
int finalX = SatelliteAnimationCreator.getTranslateX(
degrees[index], satelliteDistance);
int finalY = SatelliteAnimationCreator.getTranslateY(
degrees[index], satelliteDistance);
ImageView itemView = (ImageView) LayoutInflater.from(getContext())
.inflate(R.layout.sat_item_cr, this, false);
ImageView cloneView = (ImageView) LayoutInflater.from(getContext())
.inflate(R.layout.sat_item_cr, this, false);
itemView.setTag(menuItem.getId());
cloneView.setVisibility(View.GONE);
itemView.setVisibility(View.GONE);
cloneView.setOnClickListener(internalItemClickListener);
cloneView.setTag(Integer.valueOf(menuItem.getId()));
FrameLayout.LayoutParams layoutParams = getLayoutParams(cloneView);
layoutParams.bottomMargin = Math.abs(finalY);
layoutParams.leftMargin = Math.abs(finalX);
cloneView.setLayoutParams(layoutParams);
if (menuItem.getImgResourceId() > 0) {
itemView.setImageResource(menuItem.getImgResourceId());
cloneView.setImageResource(menuItem.getImgResourceId());
} else if (menuItem.getImgDrawable() != null) {
itemView.setImageDrawable(menuItem.getImgDrawable());
cloneView.setImageDrawable(menuItem.getImgDrawable());
}
Animation itemOut = SatelliteAnimationCreator.createItemOutAnimation(getContext(), index,expandDuration, finalX, finalY);
Animation itemIn = SatelliteAnimationCreator.createItemInAnimation(getContext(), index, expandDuration, finalX, finalY);
Animation itemClick = SatelliteAnimationCreator.createItemClickAnimation(getContext());
menuItem.setView(itemView);
menuItem.setCloneView(cloneView);
menuItem.setInAnimation(itemIn);
menuItem.setOutAnimation(itemOut);
menuItem.setClickAnimation(itemClick);
menuItem.setFinalX(finalX);
menuItem.setFinalY(finalY);
itemIn.setAnimationListener(new SatelliteAnimationListener(itemView, true, viewToItemMap));
itemOut.setAnimationListener(new SatelliteAnimationListener(itemView, false, viewToItemMap));
itemClick.setAnimationListener(new SatelliteItemClickAnimationListener(this, menuItem.getId()));
this.addView(itemView);
this.addView(cloneView);
viewToItemMap.put(itemView, menuItem);
viewToItemMap.put(cloneView, menuItem);
index++;
}
this.addView(imgMain);
}
private float[] getDegrees(int count) {
return gapDegreesProvider.getDegrees(count,
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
satellite_menu_learn.zip (92个子文件)
satellite_menu_learn
.project 856B
project.properties 406B
proguard.cfg 1KB
src
android
view
ext
IDegreeProvider.java 219B
SatelliteMenuActivity.java 2KB
ArrayDegreeProvider.java 624B
LinearDegreeProvider.java 738B
SatelliteMenuItem.java 2KB
SatelliteMenu.java 16KB
DefaultDegreeProvider.java 1KB
SatelliteAnimationCreator.java 5KB
AndroidManifest.xml 816B
psd
main.psd 226KB
item.psd 204KB
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
ic_4.png 8KB
ic_5.png 8KB
sat_main.png 8KB
ic_3.png 8KB
main.png 8KB
ic_1.png 8KB
ic_6.png 8KB
sat_item.png 8KB
ic_2.png 8KB
drawable-mdpi
ic_launcher.png 3KB
layout
sat_main.xml 406B
sat_item_cr.xml 388B
main.xml 745B
anim
sat_item_anim_click.xml 632B
sat_item_in_rotate_interpolator.xml 144B
sat_main_rotate_right.xml 358B
sat_item_anticipate_interpolator.xml 145B
sat_item_overshoot_interpolator.xml 144B
sat_item_out_rotate_interpolator.xml 144B
sat_item_click_interpolator.xml 144B
sat_main_rotate_left.xml 358B
values
sat_attrs.xml 381B
sat_strings.xml 98B
strings.xml 189B
.settings
org.eclipse.jdt.core.prefs 177B
pom.notworking 1KB
gen
android
view
ext
BuildConfig.java 158B
R.java 9KB
.classpath 364B
bin
resources.ap_ 87KB
satellite-menu-sample.apk 100KB
classes
android
view
ext
R$layout.class 455B
SatelliteMenuItem.class 3KB
SatelliteAnimationCreator.class 3KB
BuildConfig.class 341B
R$drawable.class 661B
R$attr.class 544B
LinearDegreeProvider.class 766B
SatelliteMenu$SatelliteAnimationListener.class 2KB
SatelliteMenuActivity.class 2KB
IDegreeProvider.class 158B
R$id.class 440B
SatelliteMenu$SateliteClickedListener.class 271B
SatelliteMenu$InternalSatelliteOnClickListener.class 1KB
SatelliteMenu$SavedState$1.class 1KB
R$anim.class 759B
ArrayDegreeProvider.class 755B
R.class 615B
R$string.class 450B
SatelliteMenu$1.class 1KB
SatelliteMenu$SavedState.class 3KB
SatelliteMenu$2.class 827B
SatelliteMenu$SatelliteItemClickAnimationListener.class 2KB
DefaultDegreeProvider.class 786B
SatelliteMenuActivity$1.class 1KB
R$styleable.class 798B
SatelliteMenu.class 13KB
AndroidManifest.xml 816B
satellite_test.apk 101KB
dexedLibs
satellite-menu-e4b3eb9c58b6a43631c3ff1367973f5c.jar 10KB
annotations-3c105d627a63b37660864f45b53770f5.jar 943B
jarlist.cache 119B
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
ic_4.png 8KB
ic_5.png 8KB
sat_main.png 8KB
ic_3.png 7KB
main.png 8KB
ic_1.png 8KB
ic_6.png 7KB
sat_item.png 8KB
ic_2.png 7KB
drawable-mdpi
ic_launcher.png 2KB
classes.dex 29KB
satellite_menu_learn.apk 101KB
共 92 条
- 1
Sunnyfans
- 粉丝: 129
- 资源: 43
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 量程自动切换数字电压表proteus仿真+程序资料_51单片机(论文+开题报告+源代码+详解图).zip
- 用LCD显示字符'A'_单片机C语言实例(纯C语言源代码).zip
- [图片动画]ImageMagick v6.3.2-9_imagemagick-6.3.2-9.rar
- [论坛社区]163ask问答程序 v1.5_163ask.rar
- 人工智能(Artificial Intelligence,AI)是当今科技领域最具吸引力和前景的领域之一,它致力于使计算机系统具
- PopupWindow下拉列表.zip
- 音乐播放_单片机C语言实例(纯C语言源代码).zip
- 前端开发是构建用户界面的过程,涉及网页或移动应用程序的设计、布局和交互
- 外文网站婚纱照.zip
- Sora AI的使用说明和使用技巧:欢迎使用 Sora AI,这是一款智能学习助手,旨在帮助用户提高学习效率、获取知识和解决学习
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页