package com.canvas.demo.view;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.canvas.demo.AnimationConfig;
import com.canvas.demo.R;
import com.canvas.demo.anim.CloseAppAnimation;
import com.canvas.demo.anim.NextAnimation;
import com.canvas.demo.anim.NextJitterAnimation;
import com.canvas.demo.anim.OpenAppAnimation;
import com.canvas.demo.anim.PrevAnimation;
import com.canvas.demo.anim.PrevJitterAnimation;
import com.canvas.demo.anim.RendererAnimation;
import com.canvas.demo.anim.RendererAnimation.AnimationNotification;
import com.canvas.demo.surface.RendererView;
import com.canvas.demo.util.CanvasUtil;
public class NavigationRendererView extends RendererView implements AnimationNotification {
private RendererAnimation mAnimation = null;
private int mFirstItemIndex = 0;
private int mCurrentIndex = 0;
private int mLastItemIndex = 0;
private List<NavigationItemView> mShowItems = new ArrayList<NavigationItemView>(AnimationConfig.SHOW_ITEM_COUNT) ;
private List<NavigationItemView> mAllItems = new ArrayList<NavigationItemView>() ;
private Bitmap mNavigationTitleBackground = null;
public NavigationRendererView(Context context) {
super(context);
mNavigationTitleBackground = BitmapFactory.decodeResource(getResources(),R.drawable.navigation_title_bg);
}
public void addNavigationItem(NavigationItem item)
{
mAllItems.add(new NavigationItemView(item));
}
public void doAnimation(RendererAnimation animation)
{
if(mShowItems.size() < 11)
{
mShowItems.clear();
for(int i=0;i< 11;i++)
{
int index = i % mAllItems.size();
NavigationItemView item = mAllItems.get(index);
item.setPosition(index);
mShowItems.add(item);
}
mFirstItemIndex = 0;
mCurrentIndex = mShowItems.size() / 2;
mLastItemIndex = mShowItems.size() - 1;
}
if(animation.getClass() == OpenAppAnimation.class) {
NavigationItemView item = mAllItems.get(mCurrentIndex);
((OpenAppAnimation)animation).setItemSize(item.getWidth(), item.getHeight());
}else if(animation.getClass() == CloseAppAnimation.class){
NavigationItemView item = mAllItems.get(mCurrentIndex);
((CloseAppAnimation)animation).setItemSize(item.getWidth(), item.getHeight());
}
mAnimation = animation;
mAnimation.setAnimationNotification(this);
this.startRenderer();
}
protected void onRenderer(Canvas canvas) {
if(mAnimation == null) return;
int saveCount = canvas.save();
//转换坐标
canvas.translate(0, getHeight() / 2.0f);
//绘制标题背景
drawTitleBackground(canvas);
//绘制上半部分
for(int index = 0;index < mCurrentIndex;index++)
{
mShowItems.get(index).draw(canvas, mAnimation);
}
//绘制下半部分
for(int index = mShowItems.size() - 1;index > mCurrentIndex;index--)
{
mShowItems.get(index).draw(canvas, mAnimation);
}
//绘制选中部分
mShowItems.get(mCurrentIndex).draw(canvas, mAnimation);
//还原Canvas
canvas.restoreToCount(saveCount);
if(mAnimation.isEnd())
{
this.stopRenderer();
}else{
mAnimation.nextFrame();
}
}
//----------------------绘制标题----------------------------------
private Paint mTitleBackgroundPaint = new Paint();
private void drawTitleBackground(Canvas canvas)
{
int saveCount = canvas.save();
mTitleBackgroundPaint.setAlpha(mAnimation.getTitleBackgroundAlpha());
canvas.translate(AnimationConfig.TITLE_LEFT, 0);
CanvasUtil.drawImage(canvas, mNavigationTitleBackground, 0, 0,
CanvasUtil.LEFT | CanvasUtil.VCENTER, mTitleBackgroundPaint);
canvas.restoreToCount(saveCount);
}
//-------------------------End------------------------------------
public void doAnimation(RendererAnimation animation, int step, int maxStep) {
if(animation.getClass() == NextAnimation.class){
if(step == maxStep / 2 + 1)
{
mShowItems.remove(mShowItems.size() - 1);
mCurrentIndex --;
}else if(step == maxStep){
mFirstItemIndex = ( mFirstItemIndex -1 + mAllItems.size() ) % mAllItems.size();
mLastItemIndex = ( mLastItemIndex -1 + mAllItems.size() ) % mAllItems.size();
mShowItems.add(0, mAllItems.get(mFirstItemIndex));
mCurrentIndex = mShowItems.size() / 2;
for(int i=0;i< mShowItems.size();i++)
{
mShowItems.get(i).setPosition(i);
}
this.doAnimation(new NextJitterAnimation());
}
}else if(animation.getClass() == PrevAnimation.class){
if(step == maxStep / 2)
{
mShowItems.remove(0);
}else if(step == maxStep){
mFirstItemIndex = ( mFirstItemIndex + 1 ) % mAllItems.size();
mLastItemIndex = ( mLastItemIndex + 1 ) % mAllItems.size();
mShowItems.add(mAllItems.get(mLastItemIndex));
mCurrentIndex = mShowItems.size() / 2;
for(int i=0;i< mShowItems.size();i++)
{
mShowItems.get(i).setPosition(i);
}
this.doAnimation(new PrevJitterAnimation());
}
}
}
}
firepation
- 粉丝: 2061
- 资源: 1302
最新资源
- 基于单片机的太阳能充电系统设计 仿真、程序、原文 本次系统设计的硬件部分包括单片机最小系统电路、USB升压稳压电路、锂电池充电电路、太阳能供电电路、LCD1602液晶显示电路和ADC0832数模转电压
- 基于MATLAB出图的电机效率map图 小工具 三种数据 转速 转矩 效率 数据来源 :可以是电机实测数据,也可以是采用Maxwell 中的toolkit,还可以是motorCAD计算得到的lab
- C# CSharp Modbus Rtu协议上位机源码,包括存储,数据到SQL SERVER数据库,趋势曲线图,数据报表,实时和历史报警界面,有详细注释
- matlab simulink仿真分析,基于学习的无人驾驶汽车随机,无人机模型预测控制算法,代码详细可靠,跟踪效果好,适合新学mpc与无人驾驶算法的童鞋
- 西门子1200主从PLc,博途V15 V16版 V17版 V90伺服安川机器人PLC程序,RS485自由口通讯,包含轴控制程序,含电路图资料,PN通讯
- 开源DTU全套方案 原理图 PCB BOM清单 上位机源码 keil嵌入式源码
- 双有源桥DAB 隔离型双向DCDC变器 三重移相双目标优化控制 电压闭环控制 单移相模型预测控制
- 开关磁阻电机、开绕组电机,开绕组永磁同步电机,simulink永磁同步电机pi控制、滑膜控制、直接转矩控制、SVPWM矢量控制,无位置传感器控制,扩展卡尔曼滤波,三相电机,五相电机,六相电机等 五相
- 基于MATLAB Simulink软件的单相光伏并网逆变器仿真,仿真中使用两级电路,前级BOOST升压后级光伏逆变并网,建立了光伏电池(PV)模型,同时搭建了两种最大功率点跟踪算法(MPPT),扰动观
- SIEMENS 西门子1214 PID 通信模板 西门子P SIEMENS 西门子1214 PID 通信模板 西门子PLC 1214和多台G120西门子变频器Modbud RTU通讯 (1)西门
- Comsol金属贴片建模,金属体系多极子展开分析 透反射计算与极子分析,附带讲解教程
- matlab编写,计及碳捕集电厂低碳特性的含风电电力系统源-荷多时间尺度调度方法 关键词:碳捕集电厂,风电,电力系统,碳交易机制,需求响应,多时间尺度
- Python+Django+Mysql个性化图书推荐系统 图书在线推荐系统 基于用户、项目、内容的协同过滤推荐算法 一、项目简介 1、开发工具和实现技术 Python3.8,Django3,mysq
- MATLAB代码:基于多目标粒子群算法冷热电联供综合能源系统运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化 参考文档:《基于多目标算法的冷热电联供型综合能源系统运行优化》 仿真平台
- Simulink双Y-30度六相感应电机模型,matlab18B版本 六相交流供电,做六相电机容错、多自由度控制以及本体设计的同学能用得上,六相感应电机模型+电机工作原理+参考文献等相关资料
- 基于MATLAB Simulink软件的单相光伏并网逆变器仿真,仿真中使用两级电路,前级BOOST升压后级光伏逆变并网,建立了光伏电池(PV)模型,同时搭建了两种最大功率点跟踪算法(MPPT),扰动观
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈