技术经验解读:一步步实现仿制AndroidLOL多玩盒子(一)概览

简介: 技术经验解读:一步步实现仿制AndroidLOL多玩盒子(一)概览

一、起源


最近比较闲,玩LOL的时候感觉 Android LOL多玩盒子 里面应用到的东西挺多也挺有意思,打算仿照着做一个。抱着练练手的心态,打算只使用原APK中的图片,代码和布局均自己实现。由于该应用涉及的内容较多、个人能力和空闲时间受限,可能部分功能难以实现。项目完成度达到一定程度后会将代码放到 csdn code中去。如果涉及到版权问题,请告知,我将立刻处理。


二、简单的初步分析


1,仿制过程需要使用的工具


抓包工具Fiddler、图片异步加载框架 universal-image-loader、网络请求框架android-async-http、Json解析工具jacksonjson、百度地图SDK、可能会需要使用到html解析工具 htmlparser。


2,主界面布局分析


官方版本界面如下。底部一排工具按钮,控制上半部分功能界面的切换。可能是因为在资讯页面中左右滑动的事件用来切换资讯类型了,各功能界面的之间的切换不支持左右滑动。于是,这一框架的实现比较简单,各功能界面分别放在Fragment中,底部的工具按钮控制各Fragment的显示或隐藏。标题栏的实现方式,不打算使用ActionBar,而是在布局中自己实现。


三、主界面初步实现


主界面Activity


package com.warren.lolbox;


import android.app.Activity;


import android.app.FragmentTransaction;


import android.os.Bundle;


import com.warren.lolbox.model.BaseContentFragment;


import com.warren.lolbox.model.IListener;


/


主界面


@author warren


@date 2014年12月28日


/


public class MainActivity extends Activity {


private FootFragment mFootFrag;


/


用于各功能Fragment切换的监听器


/


private IListener mListener;


private BaseContentFragment【】 mFragContents = new BaseContentFragment【5】;


private int mCurrentFragIndex = 0;


@Override


protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);


setContentView(R.layout.activity_main);


mListener = new IListener() {


@Override


public void onCall(Integer t) {


FragmentTransaction tranc = getFragmentManager().beginTransaction();


tranc.hide(mFragContents【mCurrentFragIndex】);


// 如果功能Fragment之前从未打开过,则创建并添加之;如果打开过,则显示之。


if (mFragContents【t】 == null) {


switch (t) {


case 0:


mFragContents【t】 = new ToolFragment();


break;


case 1:


mFragContents【t】 = new NewsFragment();


break;


case 2:


mFragContents【t】 = new ChatFragment();


break;


case 3:


mFragContents【t】 = new ActionFragment();


break;


case 4:


mFragContents【t】 = new FindFragment();


break;


default:


break;


}


tranc.add(R.id.fl_main_frags, mFragContents【t】, mFragContents【t】.getName());


} else {


tranc.show(mFragContents【t】);


}


tranc.commit();


mCurrentFragIndex = t;


}


};


initFrags();


}


/


添加初始Fragment


/


private void initFrags() {


FragmentTransaction tranc = getFragmentManager().beginTransaction();


mFootFrag = new FootFragment();


// 设置工具选中监听器回调。


mFootFrag.setListeners(mListener);


tranc.add(R.id.ll_main_foot_root, mFootFrag, mFootFrag.getName());


mFragContents【0】 = new ToolFragment();


tranc.add(R.id.fl_main_frags, mFragContents【0】, mFragContents【0】.getName());


tranc.commit();


}


}


第一个内容Fragment


package com.warren.lolbox;


import java.util.ArrayList;


import java.util.List;


import android.os.Bundle;


import android.view.LayoutInflater;


import android.view.View;


import android.view.ViewGroup;


import android.widget.AbsListView;


import android.widget.AdapterView;


import android.widget.AdapterView.OnItemClickListener;


import android.widget.BaseAdapter;


import android.widget.GridView;


import android.widget.ImageView;


import android.widget.LinearLayout;


import android.widget.TextView;


import com.warren.lolbox.model.BaseContentFragment;


import com.warren.lolbox.model.SimpleTool;


/


工具Fragment


@author warren


@date 2014年12月28日


/


public class ToolFragment extends BaseContentFragment {


private static String LOGTAG = "ToolFragment";


private LinearLayout mLlRoot;


private GridView mGridTools;


private AdapterGridTools mAdapter;


private List mTools = new ArrayList();


@Override


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


mLlRoot = (LinearLayout) inflater.inflate(R.layout.frag_tool, container, false);


initTools();


initCtrl();


return mLlRoot;


}


private void initTools() {


SimpleTool stBMYX = new SimpleTool(R.drawable.tool_menu_hero, R.string.toolmenu_bmyxtest);


SimpleTool stHero = new SimpleTool(R.drawable.tool_menu_hero, R.string.toolmenu_yx);


SimpleTool stVideo = new SimpleTool(R.drawable.tool_menu_video, R.string.toolmenu_video);


SimpleTool stShake = new SimpleTool(R.drawable.tool_menu_shake, R.string.toolmenu_shrink);


SimpleTool stLottery = new SimpleTool(R.drawable.tool_menu_shake, R.string.toolmenu_lottery);


SimpleTool stNews = new SimpleTool(R.drawable.tool_menu_news, R.string.toolmenu_boxnews);


SimpleTool stLiveShow = new SimpleTool(R.drawable.tool_menu_live,


R.string.toolmenu_liveshow);


SimpleTool stReflectTest = new SimpleTool(R.drawable.tool_menu_video,


R.string.toolmenu_reflecttest);


SimpleTool stBaike = new SimpleTool(R.drawable.tool_menu_baike, R.string.toolmenu_baike);


mTools.add(stBMYX);


mTools.add(stHero);


mTools.add(stVideo);


mTools.add(stShake);


mTools.add(stLottery);


mTools.add(stNews);


mTools.add(stLiveShow);


mTools.add(stReflectTest);


mTools.add(stBaike);


}


private void initCtrl() {


mGridTools = (GridView) mLlRoot.findViewById(R.id.grid_tools);


mAdapter = new AdapterGridTools(LayoutInflater.from(mLlRoot.getContext()));


mAdapter.setTools(mTools);


mGridTools.setAdapter(mAdapter);


mGridTools.setOnItemClickListener(new OnItemClickListener() {


@Override


public void onItemClick(AdapterView parent, View view, int position, long id) {


}


});


}


@Override


public String getName() {


return "ToolFragment";


}


/


工具网格的Adapter


@author warren


@date 2014年12月28日


/


class AdapterGridTools //代码效果参考:http://www.jhylw.com.cn/212941703.html

extends BaseAdapter {

private LayoutInflater inflater;


private List lstTools;


public AdapterGridTools(LayoutInflater inflater) {


this.inflater = inflater;


}


public void setTools(List tools) {


this.lstTools = tools;


}


@Override


public int getCount() {


return mTools.size();


}


@Override


public Object getItem(int position) {


return mTools.get(position);


}


@Override


public long getItemId(int position) //代码效果参考:http://www.jhylw.com.cn/474927843.html

{

return 0;


}


@Override


public View getView(int position, View convertView, ViewGroup parent) {


ViewHolder holder;


if (convertView == null) {


convertView = inflater.inflate(R.layout.frag_tool_grid, parent, false);


holder = new ViewHolder();


holder.img = (ImageView) convertView.findViewById(R.id.img);


holder.tv = (TextView) convertView.findViewById(R.id.tv);


convertView.setTag(holder);


} else {


holder = (ViewHolder) convertView.getTag();


}


holder.img.setImageResource(lstTools.get(position).imgResId);


holder.tv.setText(lstTools.get(position).txtResId);


// 设置GridView的子项完全填充GridView


AbsListView.LayoutParams param = new AbsListView.LayoutParams(


android.view.ViewGroup.LayoutParams.MATCH_PARENT, mGridTools.getHeight()


/ (lstTools.size() / 3));


convertView.setLayoutParams(param);


return convertView;


}


class ViewHolder {


ImageView img;


TextView tv;


}


}


}


几个基础类和接口


package com.warren.lolbox.model;


public interface IBaseContentFragment extends IBaseFragment{


}


package com.warren.lolbox.model;


import android.app.Fragment;


/


内容Fragment的基类


@author warren


@date 2014年12月28日


/


public abstract class BaseContentFragment extends Fragment implements IBaseContentFragment {


}


package com.warren.lolbox.model;


public interface IBaseContentFragment extends IBaseFragment{


}


package com.warren.lolbox.model;


public interface IListener {


public void onCall(T t);


}


package com.warren.lolbox.model;


/*


简单元工具


@author warren


@date 2014年12月28日


*/


public class SimpleTool {


public int imgResId;


public int txtResId;


public SimpleTool(int imgResId, int txtResId) {


super();


this.imgResId = imgResId;


this.txtResId = txtResId;


}


}


初步的主界面效果

相关文章
|
6月前
|
数据采集 SQL 数据可视化
大数据可视化技巧:借助PowerBI提升数据故事讲述力
【4月更文挑战第8天】Power BI助力大数据可视化,支持多种数据源连接,如SQL Server、Excel,提供数据清洗与转换功能。通过选择合适图表类型、运用颜色和大小强化表达,创建交互式仪表板。讲述数据故事时,注重故事主线设计,利用叙事技巧引导观众,并添加文本说明。分享已完成报告,提升数据驱动决策能力。动手实践,体验Power BI的强大与易用。
177 0
|
存储 前端开发 JavaScript
潮玩宇宙大逃杀无聊猿卷轴模式系统开发详细规则丨步骤需求丨方案项目丨技术架构丨源码功能
确定游戏类型和规则:明确无聊猿卷轴模式游戏类型和游戏规则,包括敌人类型、地图设计、任务类型、战斗机制等。
|
算法
10分钟小白都可以看懂的光度立体法以及运用到项目
10分钟小白都可以看懂的光度立体法以及运用到项目
843 0
10分钟小白都可以看懂的光度立体法以及运用到项目
|
3月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
153 3
|
6月前
|
算法 机器人 程序员
Scratch3.0——助力新进程序员理解程序(案例五、自制积木-五角星函数)
Scratch3.0——助力新进程序员理解程序(案例五、自制积木-五角星函数)
85 0
|
6月前
|
运维 Java 开发工具
Java后端学习路线6大维度详细总结(编程基础+开发工具+应用框架+运维知识+成神之路+平稳降落)【可作为知识点梳理列表】【点击可查看高清原图】
Java后端学习路线6大维度详细总结(编程基础+开发工具+应用框架+运维知识+成神之路+平稳降落)【可作为知识点梳理列表】【点击可查看高清原图】
97 0
|
运维 监控 数据可视化
超干货!数据可视化最全解决方案!酷炫效果分分钟拿捏!【附全网高质量学习资料】
超干货!数据可视化最全解决方案!酷炫效果分分钟拿捏!【附全网高质量学习资料】
379 0
超干货!数据可视化最全解决方案!酷炫效果分分钟拿捏!【附全网高质量学习资料】
|
SQL Shell API
热饭的测开成果盘点第二十四期:diy数据构造平台
不多bb,直接上图。 该平台可让同事自行去设计 数据构造功能。包括sql/api/shell等等。 由我带着心鹏君开发完成。设计巧妙,可爱。 自行设计页面输入,描述等。
热饭的测开成果盘点第二十四期:diy数据构造平台
html+css实战65-综合案例4-产品-文字效果
html+css实战65-综合案例4-产品-文字效果
223 0
html+css实战65-综合案例4-产品-文字效果
|
人工智能 供应链 算法
机器人在线“偷懒”怎么办?阿里研究出了这两套算法
随着互联网和电子商务的发展以及全球化的不断加速,中国产业持续升级,人工智能与机器人集群逐步被应用于制造业与物流供应链产业中。机器人集群的主要目的是与人协同合作,将人从沉重的重体力搬运任务中解放出来,专注于更精细的操作当中。由于在工业界的广泛应用与进一步智能化生产的思考,机器人集群调度成为了多智能体系统(Multi-agent System)学术研究中的一个新兴研究方向,其核心问题是如何调度机器人执行合适的任务并规划高效的路径,使得系统整体效率最优。 文末福利:七道典型算法笔试模拟题精解。
1297 0
机器人在线“偷懒”怎么办?阿里研究出了这两套算法
下一篇
无影云桌面