最赞回答 / 黄淘淘
因为游戏每升级一次就会触发TIME_CHANGED的消息队列发送一次,而每次的TIME_CHANGED消息队列都因为有 mHandler.sendEmptyMessage(NEXT_LEVEL)在继续发送,所以如果升级了游戏,前面那个游戏等级的TIME_CHANGED消息就要remove掉 这是我的理解
2015-08-10
最赞回答 / 为梦而战之学习
这个主要是使用了TranslateAnimation动画的原因 ,这种动画只是效果上的移动,并没有真正移动ImageView本身,也就是ImageView的真正位置值没有发生变化,你可以打印它们的(x,y)才查看一 下,换句话说当你点击 0和9位置上的ImageView时,虽然看到了交换的效果,但实质上0和9位置上的ImageView还是原来的那两个ImageView,点击的时候还是0和9对应的ImageView响应事件,而不是我们期望的让9和0对应的ImageView去响应事件,所以才在上面加一层布局来...
2015-08-08
mItemWitdh=(mWidth-mPadding*2-mMargin*(mColumn-1))/mColumn;
这个理解
这个理解
2015-08-08
最赞回答 / qq_o夜以罙_0
我的也是,不过原因找到了,主要是由于你创建动画层的时候,宽高是默认的,就是wrap那个,结果你第一次addview进去动画层的时候就自动把宽高设置成了item的宽高,所以你必须在创建动画层的时候设置他的宽高,其实很简单,只要你在addview(动画层)之前RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams(mWidth, mHeight); mAnimLayout = new RelativeLayout(getContex...
2015-08-03
如果检查的时候有一个失败直接返回,可以省去不必要的循环,效率更高!代码如下:
private void checkSuccess()
{
for (int i = 0; i < mGamePintuItems.length; i++){
ImageView imageView = mGamePintuItems[i];
if (getImageIndexByTag((String) imageView.getTag()) != i) return;
。。。
mHandler.sendEmptyMessage(NEXT_LEVEL);
}
private void checkSuccess()
{
for (int i = 0; i < mGamePintuItems.length; i++){
ImageView imageView = mGamePintuItems[i];
if (getImageIndexByTag((String) imageView.getTag()) != i) return;
。。。
mHandler.sendEmptyMessage(NEXT_LEVEL);
}
2015-08-02
可以用Handler处理,定义常量private static final int REMOVE_VIEWS = 0x112;
在onAnimationEnd里面发送消息mHandler.sendEmptyMessage(REMOVE_VIEWS);
在Handler里面的handleMessage函数里面加个case进行处理
case REMOVE_VIEWS:
mAnimLayout.removeAllViews();
break;
在onAnimationEnd里面发送消息mHandler.sendEmptyMessage(REMOVE_VIEWS);
在Handler里面的handleMessage函数里面加个case进行处理
case REMOVE_VIEWS:
mAnimLayout.removeAllViews();
break;
2015-08-02