Android:fadeIn选中的行

时间:2012-05-28 10:02:35

标签: android listview animation

我的listview与此类似:enter image description here

添加代码,它并不多,但可能有用:

CustomAdapter:

public class MyAdapter extends BaseAdapter{

private LayoutInflater mInflater;
private Animation fadeIn;
private Animation fadeOut;



public MyAdapter(Activity c) {
    mInflater = c.getLayoutInflater();
    fadeIn = AnimationUtils.loadAnimation(c.getApplicationContext(), R.anim.alpha_show);
    fadeIn.setFillAfter(true);
    fadeOut = AnimationUtils.loadAnimation(c.getApplicationContext(), R.anim.alpha_dissappear);
    fadeOut.setFillAfter(true);
}

public int getCount() {
    return MainButtonsList.getList().getSize() + 
            GlobalPrefs.getEmptyRowsAtEnd() + 
            GlobalPrefs.getEmptyRowsAtStart();
}


public View getView(int position, View v, ViewGroup parent) {
    View convertView = v;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.main_list_item, null);
    }
    ImageView iv = (ImageView) convertView.findViewById(R.id.image);
    if ((position > GlobalPrefs.getEmptyRowsAtStart() - 1) && (position < getCount() - GlobalPrefs.getEmptyRowsAtEnd())) {
        iv.setImageResource(MainButtonsList.getList().getListImageResource(position - GlobalPrefs.getEmptyRowsAtStart()));
        iv.setAlpha(255);
        iv.setTag(MainButtonsList.UNPRESSED_BUTTON_TAG);
    } else {
        iv.setTag(MainButtonsList.UNUSED_BUTTON_TAG);
        iv.setAlpha(0);
        iv.setVisibility(0);
        iv.setClickable(false);
        iv.setImageResource(R.drawable.logo_list_null);

    }
    iv.setMaxHeight(GlobalPrefs.getRowHeight());
    iv.setMaxWidth(GlobalPrefs.getRowWidth());
    iv.setBackgroundResource(0);





    return convertView;
}

public Object getItem(int position) {
    return MainButtonsList.getList().getObject(position);
}

public long getItemId(int position) {
    return position;
}

}

自定义列表视图:

public class CopyOfListView3d extends ListView{
private final Camera mCamera = new Camera();
private final Matrix mMatrix = new Matrix();
private Context context;
private Paint mPaint;


public CopyOfListView3d(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
    this.setChildrenDrawingOrderEnabled(true);

}

@Override
protected int getChildDrawingOrder (int childCount, int i) {
      //sets order number to each child, so makes overlap and center is always on top
    }

@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
    // get top left coordinates
    boolean isCenter = false;
    final int top = child.getTop();
    final int bottom = child.getBottom();
    Bitmap bitmap = child.getDrawingCache();
    if (bitmap == null) {
        child.setDrawingCacheEnabled(true);
        child.buildDrawingCache();
        bitmap = child.getDrawingCache();
    }

    final int centerY = child.getHeight() / 2;
    final int centerX = child.getWidth() / 2;
    final int radius = getHeight() / 2;
    final int absParentCenterY = getTop() + getHeight() / 2;
    final int absChildCenterY = child.getTop() + centerY;
    final int distanceY = (absParentCenterY - absChildCenterY) / 2;
    final int absDistance = Math.min(radius, Math.abs(distanceY));

    final float translateZ = (float) Math.sqrt((radius * radius) - (absDistance * absDistance));
    mCamera.save();
    float myTranslateX = (float) (translateZ * (1.5f));

    int density = GlobalPrefs.getDensity();
    if (density < DisplayMetrics.DENSITY_LOW) {
        myTranslateX = (float) myTranslateX - 80;
    } else if (density == DisplayMetrics.DENSITY_LOW) {
        myTranslateX = (float) myTranslateX - GlobalPrefs.getScreenWidth() + density + 40;
    } else if (density <= DisplayMetrics.DENSITY_MEDIUM) {
            myTranslateX = (float) myTranslateX - ((float)(GlobalPrefs.getScreenWidth()*0.75)) + density/2;
    } else
        if (density <= DisplayMetrics.DENSITY_HIGH) {
            myTranslateX = (float) myTranslateX - 320;
        } else
            if (density > DisplayMetrics.DENSITY_HIGH) {
                //Log.i("density", "this is more than high");
                myTranslateX = (float) myTranslateX;
            }
    if ((top < absParentCenterY) && (bottom > absParentCenterY)) {
        //make center row bigger
        isCenter = true;
        mCamera.translate((float) myTranslateX, 0, (float) -160);//130
        child.setPressed(true);
        child.setTag(MainButtonsList.PRESSED_BUTTON_TAG);
    }  
    else {
        //top
        child.setTag(MainButtonsList.UNPRESSED_BUTTON_TAG);
        child.setPressed(false);
        mCamera.translate((float) myTranslateX, 0, -150);//120;
    };
    mCamera.getMatrix(mMatrix);
    mCamera.restore();

    // create and initialize the paint object
    if (mPaint == null) {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setFilterBitmap(true);
    }
    //calculates alpha for each row, so far from center, rows are barely visible
    mPaint.setAlpha(calculateAlpha(absChildCenterY));

    mMatrix.postTranslate((float) (-centerX * 1.5f), top);
    canvas.drawBitmap(bitmap, mMatrix, mPaint);
    return false;
}



}

它们由ImageViews制成,其中白色处于选择状态,蓝色处于未选择状态,我通过屏幕坐标更改选择/未选择,因此始终选择中心。

我有自定义3dListView,它扩展了ListView并制作了自定义适配器,我将imageviews设置为行。代码太多了,但有很简单的

其中一个可能有帮助:

1)如何为中心行淡入(也可能淡出)(我可以在给父母或子计数时找到哪一行是中心)? (优于)

2)如果有任何OnStateChange监听器监听视图的按下,它也会有所帮助。然后,当视图变得紧迫和淡出时,我可以在任何时候淡出,当按下时。

2 个答案:

答案 0 :(得分:4)

我自己找到了答案。在drawChild方法结束时将此代码片段添加到我的自定义ListView中:

final ImageView iv = (ImageView) child.findViewById(R.id.image);
            child.setTag(MainButtonsList.PRESSED_BUTTON_TAG);

            Animation anim = fadeOut();
            anim.setAnimationListener(new Animation.AnimationListener() {

                public void onAnimationStart(Animation animation) {
                    // TODO Auto-generated method stub

                }

                public void onAnimationRepeat(Animation animation) {
                    // TODO Auto-generated method stub

                }

                public void onAnimationEnd(Animation animation) {
                    child.setPressed(true);
                    iv.startAnimation(fadeIn());
                }
            });

            iv.clearAnimation();
            iv.startAnimation(anim);

在列表项目布局中,添加了另一个图像,该图像放在项目下,现在看起来很好看。

答案 1 :(得分:3)

你想要在适配器中为listview做淡化。

在适配器中

private List<YourListObject> deleteItems;

// Constructor to init list and other vars

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

    // Draw stuff
    // including your object


    for(YourListObject obj : deleteItems){
            if(currentObj.equals(obj)){
                Animation fadeOutAnimation = new AlphaAnimation(1.0f, 0.0f);
                fadeOutAnimation.setDuration(300);
                DeleteAnimationListener listener = new DeleteAnimationListener(currentObj);
                fadeOutAnimation.setAnimationListener(listener);
                someView.startAnimation(fadeOutAnimation);
            }
        }

    return someView;
}


   public void remove(YourListObject obj){
        deleteItems.add(obj);
        notifyDataSetChanged();
    }

   protected class DeleteAnimationListener extends EndAnimationListener {

        private final YourListObject obj;

        public DeleteAnimationListener(YourListObject obj) {
            this.obj = obj;
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            yourObjects.remove(obj);
            deleteItems.remove(obj);
            notifyDataSetChanged();
        }
    };

currentObj是您当前操作的列表中的视图

yourObjects是您存储数据的列表。

deleteItems是一个新列表。

您在适配器上调用.remove(obj)以删除一个。 然后getView将从列表中删除它(使用淡出动画)一旦完成此动画,AnimationListener将从数据集中删除实际对象。

相关问题