1

私はアンドロイドでアニメーションを学んでいます。

グリッド ビューを構築し、ユーザーが 2 つのアイテムごとにクリックしたときにアイテムの位置を切り替えようとしていました (キャンディー クラッシュのように)。

これが私が使用しているコードです

    myGrid = (GridView) mainView.findViewById(R.id.my_grid);
    myGrid.setAdapter(adapter);
    myGrid.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

            if(mVPosition == null){
                mVPosition = position;
            }
            else{
                   View item1View = v;
                   View item2View = myGrid.getChildAt(mVPosition);

                   int originalPos1[] = new int[2];
                   item1View.getLocationOnScreen( originalPos1 );

                   int originalPos2[] = new int[2];
                   item2View.getLocationOnScreen( originalPos2 );

                   swVId = mThumbIds[position];
                   mThumbIds[position] = mThumbIds[mVPosition];
                   mThumbIds[mVPosition] = swVId;   // Swap items' image
                    // mThumbIds is used as image source of myGrid define in adapter code

                  item1View.animate().x(originalPos1[0]).y(originalPos1[1]).setListener(new AnimatorListener() {
                                    @Override
                                    public void onAnimationStart(Animator animation) {

                                    }
                                    @Override
                                    public void onAnimationRepeat(Animator animation) {
                                    }
                                    @Override
                                    public void onAnimationEnd(Animator animation) {

                                        adapter.notifyDataSetChanged();
                                    }
                                    @Override
                                    public void onAnimationCancel(Animator animation) {

                                    }
                                    }); 

                item2View.animate().x(originalPos2[0]).y(originalPos2[1]).setListener(new AnimatorListener() {
                                    @Override
                                    public void onAnimationStart(Animator animation) {

                                    }
                                    @Override
                                    public void onAnimationRepeat(Animator animation) {
                                    }
                                    @Override
                                    public void onAnimationEnd(Animator animation) {

                                        adapter.notifyDataSetChanged();
                                    }
                                    @Override
                                    public void onAnimationCancel(Animator animation) {

                                    }
                                    }); 
     mVPosition = null;

                }
    });

問題は、アイテムが y 方向に正しく移動しないことです。横方向にのみ移動させると、2 つのアイテムの位置が入れ替わりますが、縦方向に移動させたい場合は、すべてグリッド上の奇妙な場所に移動します

また、移動した項目は再度クリックできません。

この問題は、「adapter.notifyDataSetChanged();」の使用と関係がありますか? と ViewPropertyAnimation?

ありがとう

4

1 に答える 1

0

最初に getLocationOnScreen メソッドでグリッドビューの場所を定義し、次のコードのように各アイテムから差し引く必要があります

int gridLoc[] = new int[2];
myGrid.getLocationOnScreen(gridLoc);
.
.
.
item1View.animate().x(originalPos1[0]-gridLoc[0]).y(originalPos1[1]-gridLoc[1])....
.
.
.
item2View.animate().x(originalPos2[0]-gridLoc[0]).y(originalPos2[1]-gridLoc[1])....
于 2015-01-20T05:21:21.820 に答える