java - 翻转 gridview 的项目,如窗口瓷砖

标签 java android gridview

有一个翻转 Activity (如 FlipBoard),其适配器中有一个 GridView 作为项目。 GridView 使用BaseAdapter。现在,我想像 Windows 磁贴一样连续翻转 GridView 的内容。问题是我当前的方法是在 2 组中翻转网格内容,并且仅当我翻转到 FlipBoard View 上的最后一项时才有效。

FlipAdapter 是来自 MainActivity 的适配器,它使 FlipBoard 类似的动画成为可能:

public class FlipAdapter extends BaseAdapter {

    public interface Callback {
        public void onPageRequested(int page);
    }

    static class Item {
        static long id = 0;

        long mId;

        public Item() {
            mId = id++;
        }

        long getId() {
            return mId;
        }
    }

    private LayoutInflater inflater;
    private Context mContext;
    private int h;
    private Callback callback;
    private List<Item> items = new ArrayList<Item>();

    public FlipAdapter(Context context, int height) {
        mContext = context;
        h = height;
        inflater = LayoutInflater.from(context);
        for (int i = 0; i < 2; i++) {
            items.add(new Item());
        }
    }

    public void setCallback(Callback callback) {
        this.callback = callback;
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return items.get(position).getId();
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    ViewHolder holder;

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

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.page, parent, false);

            holder.gridView = (GridView) convertView.findViewById(R.id.home_grid);


            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.gridView.setAdapter(new HomeAdapter(mContext, h));
        holder.gridView.setVerticalScrollBarEnabled(false);
        holder.gridView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_MOVE) {
                    return true;
                }
                return false;
            }

        });

        holder.gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.e("index:", ""+holder.gridView.getChildCount());
            }
        });

        contAnimate();

        return convertView;
    }

    static class ViewHolder {
        GridView gridView;
    }

    static int lastTile = 0;
    int index = 0;

    public void contAnimate() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                while (lastTile == index)
                    index = 0 + new Random().nextInt(6);
                lastTile = index;

                ViewFlipper viewFlipper = (ViewFlipper) holder.gridView.getChildAt(index);
                Animation animation = AnimationUtils.loadAnimation(mContext, R.animator.card_flip_right_out);
                viewFlipper.setAnimation(animation);
                viewFlipper.startFlipping();
                contAnimate();
            }
        }, 5500);
    }

}

HomeAdapter 是封装在 FlipView 中的 GridView 的适配器:

public class HomeAdapter extends BaseAdapter {


    private LayoutInflater mLayoutInflater;
    private Context mContext;
    private int h;

    public HomeAdapter(Context context, int height) {
        mContext = context;
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        h = height;
    }

    @Override
    public int getCount() {
        return 6;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        FunctionHolder holder;
        if (convertView == null) {
            holder = new FunctionHolder();
            convertView = mLayoutInflater.inflate(R.layout.view_flipper, parent, false);
            holder.flipper = (ViewFlipper) convertView.findViewById(R.id.flipper);

        } else {
            holder = (FunctionHolder) convertView.getTag();
        }


        View topView = mLayoutInflater.inflate(R.layout.first_item, null);
        View bottomView = mLayoutInflater.inflate(R.layout.second_item, null);

        holder.flipper.addView(topView, 0);
        holder.flipper.addView(bottomView, 1);

        convertView.setMinimumHeight(h - 74);
        convertView.setTag(holder);
        return convertView;
    }
}

最佳答案

private void startAnimation(final ImageView imageView, int position)
    {
        // TODO Auto-generated method stub
        int iDuration = 500;
        final ScaleAnimation scaleAnimationIN = new ScaleAnimation(1.0f, 0.0f, 1.0f, 1.0f, Animation.RELATIVE_TO_SELF, (float) 0.5,
                Animation.RELATIVE_TO_SELF, (float) 0.5);
        final ScaleAnimation scaleAnimationOUT = new ScaleAnimation(0.0f, 1.0f, 1.0f, 1.0f, Animation.RELATIVE_TO_SELF, (float) 0.5,
                Animation.RELATIVE_TO_SELF, (float) 0.5);
        scaleAnimationIN.setStartOffset(8000 + position * 2000);
        scaleAnimationIN.setDuration(iDuration);
        scaleAnimationOUT.setStartOffset(0);
        scaleAnimationOUT.setDuration(iDuration);
        scaleAnimationIN.setAnimationListener(new AnimationListener()
        {

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

            }

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

            }

            @Override
            public void onAnimationEnd(Animation animation)
            {
                // TODO Auto-generated method stub
                imageView.startAnimation(scaleAnimationOUT);
            }
        });
        scaleAnimationOUT.setAnimationListener(new AnimationListener()
        {

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

            }

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

            }

            @Override
            public void onAnimationEnd(Animation animation)
            {
                // TODO Auto-generated method stub
                imageView.startAnimation(scaleAnimationIN);
            }
        });
        imageView.startAnimation(scaleAnimationIN);

    }

关于java - 翻转 gridview 的项目,如窗口瓷砖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30079281/

相关文章:

Java:从终端读取输入提示

php - Yii2:使用 Pjax 更新 GridView

java - 从 baseActivity 类重写 onCreateOptionsMenu

java - onDragOver 不会发生(在 JavaFX 中)

JavaMail 无法连接到 SMTP 主机 SSL 465 : handshake_failure

java - 从适配器获取最近添加的项目

java - 从另一个 Activity 调用时为空监听器

使用数据绑定(bind)时 Android EditText 不更新

c# - 如何获取 Gridview 底层数据源?

.net - GridView 自动换行