android里面这个动画不动了,android,AnimationDrawable 在ListView里不动的分析及解决办法。...
下面是我拷貝的一個list adapter過來, 關于這個問題, 大家只需要關注紅色部分代碼, 在官方文檔中有下面一段:
It's important to note that the start() method called on the AnimationDrawable cannot be called during the onCreate() method of your Activity, because the AnimationDrawable is not yet fully attached to the window. If you want to play the animation immediately, without requiring interaction, then you might want to call it from the
這是官方的解決辦法。
下面紅色代碼部分是我的解決辦法。 大家仔細看上面, 會明白, 就是說,在onCreate函數里不能啟動動畫。
static class AlbumListAdapter extends SimpleCursorAdapter implements SectionIndexer {
private final Drawable mNowPlayingOverlay;
private final BitmapDrawable mDefaultAlbumIcon;
private int mAlbumIdx;
private int mArtistIdx;
private int mAlbumArtIndex;
private final Resources mResources;
private final StringBuilder mStringBuilder = new StringBuilder();
private final String mUnknownAlbum;
private final String mUnknownArtist;
private final String mAlbumSongSeparator;
private final Object[] mFormatArgs = new Object[1];
private AlphabetIndexer mIndexer;
private AlbumBrowserActivity mActivity;
private AsyncQueryHandler mQueryHandler;
private String mConstraint = null;
private boolean mConstraintIsValid = false;
//add by zengdezhi for samsung musicplayer s
private Handler mHandler = new Handler();
private Runnable AmThread = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
rocketAnimation.start();
}
};
//add by zengdezhi for samsung musicplayer e
static class ViewHolder {
TextView line1;
TextView line2;
ImageView play_indicator;
ImageView icon;
}
class QueryHandler extends AsyncQueryHandler {
QueryHandler(ContentResolver res) {
super(res);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
//Log.i("@@@", "query complete");
mActivity.init(cursor);
}
}
AlbumListAdapter(Context context, AlbumBrowserActivity currentactivity,
int layout, Cursor cursor, String[] from, int[] to) {
super(context, layout, cursor, from, to);
mActivity = currentactivity;
mQueryHandler = new QueryHandler(context.getContentResolver());
mUnknownAlbum = context.getString(R.string.unknown_album_name);
mUnknownArtist = context.getString(R.string.unknown_artist_name);
mAlbumSongSeparator = context.getString(R.string.albumsongseparator);
Resources r = context.getResources();
mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list);
Bitmap b = BitmapFactory.decodeResource(r, R.drawable.albumart_mp_unknown_list);
mDefaultAlbumIcon = new BitmapDrawable(context.getResources(), b);
// no filter or dither, it's a lot faster and we can't tell the difference
mDefaultAlbumIcon.setFilterBitmap(false);
mDefaultAlbumIcon.setDither(false);
getColumnIndices(cursor);
mResources = context.getResources();
}
private void getColumnIndices(Cursor cursor) {
if (cursor != null) {
mAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM);
mArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST);
mAlbumArtIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ART);
if (mIndexer != null) {
mIndexer.setCursor(cursor);
} else {
mIndexer = new MusicAlphabetIndexer(cursor, mAlbumIdx, mResources.getString(
R.string.fast_scroll_alphabet));
}
}
}
public void setActivity(AlbumBrowserActivity newactivity) {
mActivity = newactivity;
}
public AsyncQueryHandler getQueryHandler() {
return mQueryHandler;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = super.newView(context, cursor, parent);
ViewHolder vh = new ViewHolder();
vh.line1 = (TextView) v.findViewById(R.id.line1);
vh.line2 = (TextView) v.findViewById(R.id.line2);
vh.play_indicator = (ImageView) v.findViewById(R.id.play_indicator);
vh.icon = (ImageView) v.findViewById(R.id.icon);
vh.icon.setBackgroundDrawable(mDefaultAlbumIcon);
vh.icon.setPadding(0, 0, 1, 0);
v.setTag(vh);
return v;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder vh = (ViewHolder) view.getTag();
String name = cursor.getString(mAlbumIdx);
String displayname = name;
boolean unknown = name == null || name.equals(MediaStore.UNKNOWN_STRING);
if (unknown) {
displayname = mUnknownAlbum;
}
vh.line1.setText(displayname);
name = cursor.getString(mArtistIdx);
displayname = name;
if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
displayname = mUnknownArtist;
}
vh.line2.setText(displayname);
ImageView iv = vh.icon;
// We don't actually need the path to the thumbnail file,
// we just use it to see if there is album art or not
String art = cursor.getString(mAlbumArtIndex);
long aid = cursor.getLong(0);
if (unknown || art == null || art.length() == 0) {
iv.setImageDrawable(null);
} else {
Drawable d = MusicUtils.getCachedArtwork(context, aid, mDefaultAlbumIcon);
iv.setImageDrawable(d);
}
long currentalbumid = MusicUtils.getCurrentAlbumId();
iv = vh.play_indicator;
if (currentalbumid == aid) {
//change by zengdezhi for samsung musicplayer s
//??????????????? iv.setImageDrawable(mNowPlayingOverlay);
iv.setBackgroundResource(R.drawable.playing_list_framebyframe);
rocketAnimation = (AnimationDrawable) iv.getBackground();
//?????????? ??? ?rocketAnimation.start();
mHandler.postDelayed(AmThread, 300);
System.out.println("zengdezhialbumanimation");
//change by zengdezhi for samsung musicplayer e
} else {
//add by zengdezhi for samsung musicplayer s
iv.setBackgroundDrawable(null);
//add by zengdezhi for samsung musicplayer e
iv.setImageDrawable(null);
}
}
@Override
public void changeCursor(Cursor cursor) {
if (mActivity.isFinishing() && cursor != null) {
cursor.close();
cursor = null;
}
if (cursor != mActivity.mAlbumCursor) {
mActivity.mAlbumCursor = cursor;
getColumnIndices(cursor);
super.changeCursor(cursor);
}
}
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
String s = constraint.toString();
if (mConstraintIsValid && (
(s == null && mConstraint == null) ||
(s != null && s.equals(mConstraint)))) {
return getCursor();
}
Cursor c = mActivity.getAlbumCursor(null, s);
mConstraint = s;
mConstraintIsValid = true;
return c;
}
public Object[] getSections() {
return mIndexer.getSections();
}
public int getPositionForSection(int section) {
return mIndexer.getPositionForSection(section);
}
public int getSectionForPosition(int position) {
return 0;
}
}
通過看上面的紅色代碼, 我們可以發現, 我將立即啟動動畫語句//?????????? ??? ?rocketAnimation.start();
mHandler.postDelayed(AmThread, 300)
注銷了, 而是改為了通過Handler 300ms后啟動。 這是因為在onCreate函數中不能啟動動畫的原因。
如官方文檔所述的一樣。 呵呵, 這個問題讓我很不爽。 現在解決了, 來分享給大家,
我也是看網友的 微博。 我是根據這篇文章的提問找到解決辦法的。 由于要注冊網站才能回復你的問題。
所以我不想那么麻煩。 你只需要把你的標題搜索一下, 應該就能搜索到我的文章了, 如果你還有解決,
歡迎搜索。 呵呵
總結
以上是生活随笔為你收集整理的android里面这个动画不动了,android,AnimationDrawable 在ListView里不动的分析及解决办法。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intel秘密工具首次公开:6大8小14
- 下一篇: 英特尔内部超频软件曝光,将 i9-139