第一百九十二回:Android中自定义ProgressBar原理分析与总结二
探讨Android中自定义ProgressBar的原理与总结
深入分析Android中ProgressBar的实现原理,本回继续上一回的内容。上一回中我们详细解读了默认的style文件,这一回我们专注于自定义style文件Widget.ProgressBar.Horizontal,它属于系统预设的样式之一。除了这个style之外,软件项目管理软件 源码系统还提供了其他样式,但它们与默认样式类似,因此省略不作详述。若想深入了解,可查阅frameworks/base/core/res/res/values/styles.xml文件,该文件内含所有进度条的样式信息,同时,包括SeekBar和RatingBar在内的子类也使用了此类样式,其具体实现亦在此文件中。
Widget.ProgressBar.Horizontal源代码揭示,它采用progress_horizontal和progress_indeterminate_horizontal两个Drawable文件。这些文件位于frameworks/base/core/res/res/values/drawable目录下。
首先,我们关注progress_horizontal的实现。它构建了图层,每个图层中包含多种元素,与之前回中的自定义Drawable文件类似,具体细节则不赘述。
接着,我们解析progress_indeterminate_horizontal的源代码。通过代码可知,它运用了动画机制,动画中包含三个,这些位于frameworks/base/core/res/res/drawable-mdpi目录下。
至此,我们已经分析了使用了两种style文件的进度条,其中,图形相关元素多通过Drawable资源文件实现。网址导航源码大全若欲设计各种精美的进度条,从Drawable资源文件入手,不失为一种有效途径。此外,进度条本质上属于自定义View,不仅需要处理Drawable文件,View相关的方法也需妥善处理,否则无法在程序中正常运行。
至此,关于Android中ProgressBar原理与总结的例子介绍完毕。欲知更多例子,请关注下回内容。
用C++编写的小游戏源代码
五子棋的代码:#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
using namespace std;
const int N=; //*的棋盘
const char ChessBoardflag = ' '; //棋盘标志
const char flag1='o'; //玩家1或电脑的棋子标志
const char flag2='X'; //玩家2的棋子标志
typedef struct Coordinate //坐标类
{
int x; //代表行
int y; //代表列
}Coordinate;
class GoBang //五子棋类
{
public:
GoBang() //初始化
{
InitChessBoard();
}
void Play() //下棋
{
Coordinate Pos1; // 玩家1或电脑
Coordinate Pos2; //玩家2
int n = 0;
while (1)
{
int mode = ChoiceMode();
while (1)
{
if (mode == 1) //电脑vs玩家
{
ComputerChess(Pos1,flag1); // 电脑下棋
if (GetVictory(Pos1, 0, flag1) == 1) //0表示电脑,真表示获胜
break;
PlayChess(Pos2, 2, flag2); //玩家2下棋
if (GetVictory(Pos2, 2, flag2)) //2表示玩家2
break;
}
else //玩家1vs玩家2
{
PlayChess(Pos1, 1, flag1); // 玩家1下棋
if (GetVictory(Pos1, 1, flag1)) //1表示玩家1
break;
PlayChess(Pos2, 2, flag2); //玩家2下棋
if (GetVictory(Pos2, 2, flag2)) //2表示玩家2
break;
}
}
cout << "***再来一局***" << endl;
cout << "y or n :";
char c = 'y';
cin >> c;
if (c == 'n')
break;
}
}
protected:
int ChoiceMode() //选择模式
{
int i = 0;
system("cls"); //系统调用,清屏
InitChessBoard(); //重新初始化棋盘
cout << "***0、退出 1、电脑vs玩家 2、玩家vs玩家***" << endl;
while (1)
{
cout << "请选择:";
cin >> i;
if (i == 0) //选择0退出
exit(1);
if (i == 1 || i == 2)
return i;
cout << "输入不合法" << endl;
}
}
void InitChessBoard() //初始化棋盘
{
for (int i = 0; i < N + 1; ++i)
{
for (int j = 0; j < N + 1; ++j)
{
_ChessBoard[i][j] = ChessBoardflag;
}
}
}
void PrintChessBoard() //打印棋盘,这个函数可以自己调整
{
system("cls"); //系统调用,清空屏幕
for (int i = 0; i < N+1; ++i)
{
for (int j = 0; j < N+1; ++j)
{
if (i == 0) //打印列数字
{
if (j!=0)
printf("%d ", j);
else
printf(" ");
}
else if (j == 0) //打印行数字
printf("%2d ", i);
else
{
if (i < N+1)
{
printf("%c |",_ChessBoard[i][j]);
}
}
}
cout << endl;
cout << " ";
for (int m = 0; m < N; m++)
{
printf("--|");
}
cout << endl;
}
}
void PlayChess(Coordinate& pos, int player, int flag) //玩家下棋
{
PrintChessBoard(); //打印棋盘
while (1)
{
printf("玩家%d输入坐标:", player);
cin >> pos.x >> pos.y;
if (JudgeValue(pos) == 1) //坐标合法
break;
cout << "坐标不合法,重新输入" << endl;
}
_ChessBoard[pos.x][pos.y] = flag;
}
void ComputerChess(Coordinate& pos, char flag) //电脑下棋
{
PrintChessBoard(); //打印棋盘
int x = 0;
int y = 0;
while (1)
{
x = (rand() % N) + 1; //产生1~N的随机数
srand((unsigned int) time(NULL));
y = (rand() % N) + 1; //产生1~N的随机数
srand((unsigned int) time(NULL));
if (_ChessBoard[x][y] == ChessBoardflag) //如果这个位置是空的,也就是没有棋子
break;
}
pos.x = x;
pos.y = y;
_ChessBoard[pos.x][pos.y] = flag;
}
int JudgeValue(const Coordinate& pos) //判断输入坐标是不是合法
{
if (pos.x > 0 && pos.x <= N&&pos.y > 0 && pos.y <= N)
{
if (_ChessBoard[pos.x][pos.y] == ChessBoardflag)
{
return 1; //合法
}
}
return 0; //非法
}
int JudgeVictory(Coordinate pos, char flag) //判断有没有人胜负(底层判断)
{
int begin = 0;
int end = 0;
int begin1 = 0;
int end1 = 0;
//判断行是否满足条件
(pos.y - 4) > 0 ? begin = (pos.y - 4) : begin = 1;
(pos.y + 4) >N ? end = N : end = (pos.y + 4);
for (int i = pos.x, j = begin; j + 4 <= end; j++)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i][j + 1] == flag&&
_ChessBoard[i][j + 2] == flag&&_ChessBoard[i][j + 3] == flag&&
_ChessBoard[i][j + 4] == flag)
return 1;
}
//判断列是否满足条件
(pos.x - 4) > 0 ? begin = (pos.x - 4) : begin = 1;
(pos.x + 4) > N ? end = N : end = (pos.x + 4);
for (int j = pos.y, i = begin; i + 4 <= end; i++)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j] == flag&&
_ChessBoard[i + 2][j] == flag&&_ChessBoard[i + 3][j] == flag&&
_ChessBoard[i + 4][j] == flag)
return 1;
}
int len = 0;
//判断主对角线是否满足条件
pos.x > pos.y ? len = pos.y - 1 : len = pos.x - 1;
if (len > 4)
len = 4;
begin = pos.x - len; //横坐标的起始位置
begin1 = pos.y - len; //纵坐标的起始位置
pos.x > pos.y ? len = (N - pos.x) : len = (N - pos.y);
if (len>4)
len = 4;
end = pos.x + len; //横坐标的结束位置
end1 = pos.y + len; //纵坐标的结束位置
for (int i = begin, j = begin1; (i + 4 <= end) && (j + 4 <= end1); ++i, ++j)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j + 1] == flag&&
_ChessBoard[i + 2][j + 2] == flag&&_ChessBoard[i + 3][j + 3] == flag&&
_ChessBoard[i + 4][j + 4] == flag)
return 1;
}
//判断副对角线是否满足条件
(pos.x - 1) >(N - pos.y) ? len = (N - pos.y) : len = pos.x - 1;
if (len > 4)
len = 4;
begin = pos.x - len; //横坐标的起始位置
begin1 = pos.y + len; //纵坐标的起始位置
(N - pos.x) > (pos.y - 1) ? len = (pos.y - 1) : len = (N - pos.x);
if (len>4)
len = 4;
end = pos.x + len; //横坐标的结束位置
end1 = pos.y - len; //纵坐标的结束位置
for (int i = begin, j = begin1; (i + 4 <= end) && (j - 4 >= end1); ++i, --j)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j - 1] == flag&&
_ChessBoard[i + 2][j - 2] == flag&&_ChessBoard[i + 3][j - 3] == flag&&
_ChessBoard[i + 4][j - 4] == flag)
return 1;
}
for (int i = 1; i < N + 1; ++i) //棋盘有没有下满
{
for (int j =1; j < N + 1; ++j)
{
if (_ChessBoard[i][j] == ChessBoardflag)
return 0; //0表示棋盘没满
}
}
return -1; //和棋
}
bool GetVictory(Coordinate& pos, int player, int flag) //对JudgeVictory的一层封装,得到具体那个玩家获胜
{
int n = JudgeVictory(pos, flag); //判断有没有人获胜
if (n != 0) //有人获胜,0表示没有人获胜
{
PrintChessBoard();
if (n == 1) //有玩家赢棋
{
if (player == 0) //0表示电脑获胜,1表示玩家1,2表示玩家2
printf("***电脑获胜***\n");
else
printf("***恭喜玩家%d获胜***\n", player);
}
else
printf("***双方和棋***\n");
return true; //已经有人获胜
}
return false; //没有人获胜
}
private:
char _ChessBoard[N+1][N+1];
};
扩展资料:
设计思路
1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。
2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。php照片管理源码
3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。
java怎么开发安卓?
安卓系统是用java开发的吗?
android是基于linux的开源操作系统。\r\nlinux是使用标准C语言开发的操作系统。\r\nandroid底层驱动以及操作系统内核使用C语言以及汇编开发。\r\nandroid操作系统本身是使用Java开发,并使用JNI调用本地的C语言库,实现操作系统底层调度。\r\n\r\nandroid应用是使用Java开发;同时也可以使用C/C++native开发,但是多数时候不用用到C。所以基本上就是Java为标准开发语言。\r\nandroid使用了修改过的JVM(Java虚拟机)叫做dalvik虚拟机,其本质还是Java虚拟机。\r\n所以对应每一个APP都会创建个dalvik虚拟机,也就是一个linux进程。\r\n\r\n说复杂了,其实就是基于linux下的修改版Java虚拟机,运行java程序。
北大青鸟java培训:安卓开发需要学习哪些知识?自学Android到什么程度才能找到工作?对于自学Android的朋友们来说这是最疑问的事情,选择自学Android的原因一般氛围两点,一点是爱好想要业余学习一下,另外一种就是想从事Android行业的,不管是哪种,都可以了解一下自学Android到什么程度才能找到工作,毕竟这个行业的前景还是很可观,不仅需求量大,而且薪资待遇都是非常不错的。
接下来就跟着成都北大青鸟一起了解自学Android都需要学习哪些知识吧!1、Java基础Java语言其实应用很广泛,对于Android开发来说只需要你掌握JavaSE就够了,智能聊天系统源码尤其对于一个Android初学者只需要掌握Java基础就行,这包括哪些呢?我粗略的列了下,主要包括:Java基本语法、面向对象相关的基本概念与思想,常用String类的api,异常处理,IO基础,容器,多线程,内存管理与垃圾回收,知道并最好知道几种常见的Java设计模式等,建议可以找些网上Java面试宝典之类的文章,熟悉下面试常遇到的一些Java知识点,一般都是Java基础。
2、Android基础Java如果算基础中的基础,那这部分才是你找工作的核心技能,毕竟你要从事的是Android开发,所以Android基础一定要牢固,这部分包括:Android基础UI控件的熟练掌握,也就是指Button、TextView、EditText、CheckBox、RadioButton、ImageView、Spinner、ProgressBar、SeekBar、ListView、RecycleView、ScrollView等,可能不全,步进马达 驱动源码以上只是一时想到的,可自行补充。
Android四大组件的理解与熟练掌握,四大组件就不必说了吧,具体掌握到什么程度呢?如果我问到「Activity的生命周期」你还支支吾吾的那我就没心情继续问下去了,其他一些如Activity的四种启动模式,Fragment的生命周期、Fragment与Activity之间的关系,BroadcastReceiver、ContentProvider、Service的使用场景与具体用法,更细节点的如BroadcastReceiver的广播类型与不同的注册方式的区别等都应该关注并理解到位。
动画相关也是必须掌握的,不管是矢量动画还是属性动画的api都应该熟练,一些简单的动画应该随手就能写出来才行。
自定义View得会吧?这个在实际的开发中经常遇到,因为基本的那些UI控件不可能完全满足你的需求。
Sqlite与SQL语句得掌握吧,数据库虽然说在客户端开发上只有特定的业务或者场景才用得到,但是SQL语句这是基础,基本的操作sqlite相关的api也必须要掌握。
北大青鸟java培训:如何学习好安卓开发?
自从智能手机问世以来,安卓开发技术人员也逐渐随着市场需求而增加,广阔的就业前景更是吸引了众多怀揣梦想和想拿高薪的学子。
那么对于安卓新手来讲,到底怎么才能学好安卓开发呢?首先要掌握一门计算机语言现在C语言课程在理工类专业的大学生课表里随处可见,尤其是和计算机相关的专业还会有更深入的语言,只是很多同学在大学期间并没有好好学习,如果对它掌握的不够熟练或者很久没使用过了,北大青鸟湖北计算机学院建议先从将其好好复习一下,将其基本的语法再好好回顾一下,最好能搭建一个环境来运行、调试它。
如果没有学过,不妨也提前学习一下。
大部分的高校所开设的C语言使用的教材都是用它作为教材,因此无论是购买还是借阅,都容易找到。
所以学习一门编程语言还是很容易的。
其次要掌握数据结构和算法基础知识如果后续有志于游戏方面的开发,最好具备一定的数据结构和算法基础知识。
虽然现代的高级编程语言中,其类库中已经帮我们实现了大部分的数据结构,一般情况下,我们直接使用即可。
但如果能对其原理有所了解,当需要在这些数据结构和算法中间的时候,可以更加的清楚到底应该选择哪个数据结构或者算法。
另外,在图形图像处理上面,线性代数的作用也非常重要,如果能掌握一点这方面的基础知识,无疑也会在后续的学习中如虎添翼。
最后要了解Java基础知识安卓应用的开发语言用的是Java语言,并且在安卓中也用到了Java核心类库的大量的类,因此,在学习安卓开发之前,可以先把Java基本语法和JavaSE的基础类库好好学习一下。
安卓应用程序开发是以Java语言为基础的,所以没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的。
建议在安卓课程前期的java学习阶段中,需要用心的学好。
Java能转Android开发吗?如何转?很多同学在昆明北大青鸟java学院学完java开发后因工作需要要求做android开发,于是问我们的咨询老师说:Java能转Android开发吗?怎么转?需要注意什么了?昆明北大青鸟java培训老师为你解答。
1、Java和Android程序的区别
Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择。学安卓从事移动互联方向开发,学Java从事软件、网站开发。而安卓上的应用大多是Java编写的,所以建议在安卓前期的Java学习阶段中,要用心学好。
2、Java转Android前的准备
其实Java程序员要自学安卓开发的基础知识还是没有什么难度的,毕竟语言相通,特性相似,阅读安卓源代码的门槛以比较低一些,学习安卓也相对比较轻松一些。
所以Java程序员转安卓开发可以看做是一次“增量更新”,只需要学习一下安卓的基本组件:Activity、ContentProvider、Service、BroadcastReceiver;
了解一下安卓中的Intent,Handler,Adapter以及各类事件的传递方式(onClick,onTouch等);
同时辅助一定的代码量,像JNI、AIDL什么的都可以看一下;你还要摒弃“UI元素像素位置”这个概念,安卓本身是允许通过设定元素位置来制作UI的,如果你这样做导致的结果便是大批机器不适配,那么显示效果就有点惨不忍睹了,所以不要妄想通过获取屏幕大小来调整UI。
还有熟悉ide,安卓提供的开发框架、Java及其他编程知识等。
3、Java转Android经验分享
移动开发和PC上的开发带来了哪些不一样?
从年之后,传统桌面的开发者基本都转向了J2EE/.NET/LAMP等以Web技术或者服务器端开发技术为主的开发方式。使用C/C++/MFC/Delphi等开发C/S模式的用户越来越少,甚至工作的需求也开始变得越来越少。
那对于移动开发上需要什么?
从桌面端转向移动端,一定要认识到二者不同的侧重点。桌面端包括web更侧重于逻辑复杂,高级的任务,而移动端的娱乐性明显更强。
就从操作方式说起吧,桌面端主要靠鼠标键盘和touchpad,所以操作精度要高得多,很容易将很多功能集成到一个界面里;但同样的思路就完全不适用于移动端了(反例我是实在想不起来了,大家可以帮忙想想),相信一个clutteredui的app,就算功能再强大,用户盯着你的界面超过3s就会头晕,点击某个button要点好几下才会成功,也必定是一个糟糕的app。
云南北大青鸟java培训告诉你怎么学安卓手机开发?程序员,相信在很多人眼中是一个非常神秘,非常特别又或者说非常有趣的职业。因为在这个行业里面实在出现了太多的英雄,丽江计算机学校认为每一个英雄的事迹都足以让我们热血沸腾。但是,又有谁知道在这些英雄的背后,藏着多少辛酸,藏着多少的努力,这个行业需要的是拥有努力、认真、坚持等品质的人。
1、了解编程语言切合实际的目标定位
2、开发思想是精髓项目实战是武器
如何学好软件编程?
1、首先要给自己定一个明确的目标。
2、分清楚语言和工具的区别。
4、把思想放在首位,语言在精不在多,学好了一门语言再去学其他的,就易如反掌了。
5、工具是经常被淘汰的,不要被工具所迷惑,坚定自己的信念。
6、无论选择做什么系统开发,首先要去了解这个系统,只有了解了这个系统才能在上面为所欲为。
6怎么学android手机开发
很多朋友一上手就开始学习Android,似乎太着急了一些。那么,怎么学android手机开发?
android手机开发是以Java语言为基础的,所以没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的。那么Java学到什么程度才算是过关呢?丽江北大青鸟老师认为至少要掌握以下两个方面的内容:
1、Java基础语法
设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。设计模式的种类非常之多,一个一个的全部掌握,是不现实的,必须首先掌握面向对象的基础设计原则,有了这些基础原则的支持,就可以举一反三。这部分内容可以在《EffectiveJava》和《Agile.Software.Development:Principles,Patterns.and.Practices》这两本书中找到。
2、Linux基础知识:
Android系统的基础是Linux操作系统。在开发过程当中,我们也需要使用到一些Linux命令。所以说一些Linux的基础知识是必须的(话说现在的程序员,不懂Linux都不好意思跟人家打招呼),推荐大家看看《鸟哥的私房菜》这本书,写的相当不错;
3、数据库基础知识
这个比较简单,就是一个增删改查的数据库操作,可以看一下这本书:《SQL编程练习与解答》
4、网络协议
至少需要学习两种基础的协议,HTTP协议与Socket协议;
5、Android基础知识
有了以上的铺垫,再来看Android,是不是觉得轻松了很多呢?至于基础知识的学习顺序,最好的方法就是按照AndroidSDK帮助文档当中的DevGuide里面的顺序。
2024-11-20 22:30
2024-11-20 22:14
2024-11-20 21:29
2024-11-20 20:54
2024-11-20 19:54