麻煩老師看一下哪出問題了,crash了

package com.pintu.activity.selfui;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.Exchanger;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import com.example.caige.R;
import com.pintu.activity.util.ImagePiece;
import com.pintu.activity.util.ImageSplitterUtil;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
public class GamePintuLayout extends RelativeLayout implements OnClickListener {
? private int mColumn=3;
? //內邊距
? private int mPadding;
? //間隙dp
? private int mMagin=3;
??
? private ImageView[] mGamePintuItems;
? private int mItemWidth;
??
? private Bitmap mBitmap;
??
? private List<ImagePiece>mItemBitmaps;
??
? private boolean once;
? //游戲面板寬度
? private int mWidth;
??
??
??
public GamePintuLayout(Context context) {
this(context,null);
// TODO Auto-generated constructor stub
}
public GamePintuLayout(Context context, AttributeSet attrs) {
this(context,attrs,0);
// TODO Auto-generated constructor stub
}
public GamePintuLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
? ?init();
}
private void init() {
// TODO Auto-generated method stub
mMagin=(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,3,
getResources().getDisplayMetrics());
mPadding=min(getPaddingLeft(),getPaddingRight(),
getPaddingTop(),getPaddingBottom());
}
? @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
? ??
mWidth=Math.min(getMeasuredHeight(),getMeasuredWidth());
if(!once){
//進行切圖,排序
? initBitmap();
? //設置ImageView(Item)的寬高
? initItem();
? once=true;
}
setMeasuredDimension(mWidth,mWidth);
? }
??
??
? //切圖,排序
private void initBitmap() {
// TODO Auto-generated method stub
if(mBitmap==null){
mBitmap=BitmapFactory.decodeResource(getResources(),
R.drawable.image);
}
mItemBitmaps=ImageSplitterUtil.splitImage(mBitmap,mColumn);
Collections.sort(mItemBitmaps, new Comparator<ImagePiece>() {
@Override
public int compare(ImagePiece a, ImagePiece b) {
//亂序
return Math.random()>0.5?1:-1;
}
});
}
private void initItem(){
mItemWidth=(mWidth-mPadding*2-mMagin*(mColumn-1))/mColumn;
? ?
mGamePintuItems=new ImageView[mColumn*mColumn];
//生成Item
? for(int i=0;i<mGamePintuItems.length;i++){
? ImageView item =new ImageView(getContext());
??
? item.setOnClickListener(this);
??
? item.setImageBitmap(mItemBitmaps.get(i).getBitmap());
??
? mGamePintuItems[i]=item;
? item.setId(i+1);
? item.setTag(i+"_"+mItemBitmaps.get(i).getIndex());
??
? RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(
? mItemWidth,mItemWidth);
??
??
? //不是最后一列,設置橫向間距
? ? ? ? ? ? ?
? if((i+1)%mColumn!=0){
? lp.rightMargin=mMagin;
? }
??
? //不是第一列
? if(i%mColumn!=0){
? lp.addRule(RelativeLayout.RIGHT_OF,
? mGamePintuItems[i-1].getId());
? }
??
? //不是第一行
? if((i+1)>mColumn){
? lp.topMargin=mMagin;
? lp.addRule(RelativeLayout.BELOW,mGamePintuItems[i-mColumn].getId());
??
? }
??
? addView(item,lp);
}
}
private int min(int...params) {
// TODO Auto-generated method stub
int min=params[0];
for(int param:params){
if(param<min){
min=param;
}
}
return min;
}
private ImageView mFirst;
private ImageView mSecond;
@Override
public void onClick(View v) {
//兩次點擊同一個
if(mFirst==v){
mFirst.setColorFilter(null);
mFirst=null;
return;
}
if(mFirst==null){
mFirst=(ImageView) v;
mFirst.setColorFilter(Color.parseColor("#55FF0000"));
}else
{
mSecond=(ImageView) v;
//交換Item
exchangeView();
}
}
//動畫層
private RelativeLayout mAnimLayout;
//交換Item
private void exchangeView() {
mFirst.setColorFilter(null);
setUpAnimLayout();
ImageView first=new ImageView(getContext());
final Bitmap firstBitmap=mItemBitmaps.get(getImageIdByTag((String)mFirst.getTag())).getBitmap();
first.setImageBitmap(firstBitmap);
LayoutParams lp=new LayoutParams(mItemWidth,mItemWidth);
lp.leftMargin=mFirst.getLeft()-mPadding;
lp.topMargin=mFirst.getTop()-mPadding;
first.setLayoutParams(lp);
mAnimLayout.addView(first);
ImageView second=new ImageView(getContext());
final Bitmap secondBitmap=mItemBitmaps.get(getImageIdByTag((String)mSecond.getTag())).getBitmap();
second.setImageBitmap(secondBitmap);
LayoutParams lp2=new LayoutParams(mItemWidth,mItemWidth);
lp2.leftMargin=mSecond.getLeft()-mPadding;
lp2.topMargin=mSecond.getTop()-mPadding;
second.setLayoutParams(lp2);
mAnimLayout.addView(second);
//設置動畫
TranslateAnimation anim=new TranslateAnimation(0,mSecond.getLeft()
-mFirst.getLeft(),0,mSecond.getTop()-mFirst.getTop());
anim.setDuration(300);
anim.setFillAfter(true);
first.startAnimation(anim);
TranslateAnimation animSecond=new TranslateAnimation(0,-mSecond.getLeft()
+mFirst.getLeft(),0,-mSecond.getTop()+mFirst.getTop());
animSecond.setDuration(300);
animSecond.setFillAfter(true);
second.startAnimation(animSecond);
//動畫監聽
anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
mFirst.setVisibility(View.INVISIBLE);
mSecond.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
//String firstTag=(String) mFirst.getTag();
// secondTag=(String) mSecond.getTag();
? // String[] firstParams=firstTag.split("_");
? // String[] secondParams=secondTag.split("_");
? ?
? ?//Bitmap firstBitmap= mItemBitmaps.get(Integer.parseInt(firstParams[0])).getBitmap();
? ?//Bitmap secondBitmap= mItemBitmaps.get(Integer.parseInt(secondParams[0])).getBitmap();
? ?String firstTag=(String) mFirst.getTag();
? ?String secondTag=(String) mSecond.getTag();
? ?
? ?
??
??
? // String[] firstParams=firstTag.split("_");
//String[] secondParams=secondTag.split("_");?
mFirst.setImageBitmap(secondBitmap);
? ?mSecond.setImageBitmap(firstBitmap);
??
mFirst.setTag(secondTag);
? ?mSecond.setTag(firstTag);
? ?
? ?mFirst.setVisibility(View.VISIBLE);
? ?mSecond.setVisibility(View.VISIBLE);
? ?
? ?mFirst=mSecond=null;
? ?
? ?mAnimLayout.removeAllViews();
}
});
? ?
? ?
? ?
? ?
}
//根據tag獲取id
public int getImageIdByTag(String tag){
String[] split= tag.split("_");
return Integer.parseInt(split[0]);
}
public int getImageIndex(String tag){
String[] split= tag.split("_");
return Integer.parseInt(split[1]);
}
//構造動畫層
private void setUpAnimLayout() {
// TODO Auto-generated method stub
if(mAnimLayout==null)
{
mAnimLayout=new RelativeLayout(getContext());
addView(mAnimLayout);
}
}
}
2015-02-02
你好,關閉下硬件加速試試,例如:<activity?android:hardwareAccelerated="false"?...> 。?
2016-05-24
采摘@兩頁深海貝殼
竟然解決了,望有同樣問題的同學,可以看看
把mAnimLayout.removeAllViews()放在onAnimationEnd()中有的手機可以報錯??梢該Q成
if (mAnimLayout == null) {
mAnimLayout = new RelativeLayout(getContext());
addView(mAnimLayout);
} else {
mAnimLayout.removeAllViews();
}
2016-05-24
我也是這樣的問題,求解答求解答~~
2015-02-01
補充一下
2015-01-31
把log也粘上來啊,只有源碼不好找,話說我的也崩了,報的空指針目前還在找哪錯了。。