Android Coverflow - 聚焦其位置已知的图像

时间:2012-05-15 10:04:29

标签: android android-widget coverflow

我已经实施了Android Coverflow示例。单击图像,我可以检索其位置并在ImageView中显示图像。 我的另一个要求是当我传递其ID 时将图像聚焦在coverFlow中。我应该将聚焦的图像带到中心。 这是用于在变换期间计算图像之间的角度的代码。如何更改它以达到所需的输出?

 protected boolean getChildStaticTransformation(final View child, final Transformation t) {

    final int childCenter = getCenterOfView(child);
    final int childWidth = child.getWidth();
    int rotationAngle = 0;

    t.clear();
    t.setTransformationType(Transformation.TYPE_MATRIX);

    if (childCenter == mCoveflowCenter) {
        transformImageBitmap((ImageView) child, t, 0);
    } else {
        rotationAngle = (int) ((float) (mCoveflowCenter - childCenter) / childWidth * mMaxRotationAngle);
        if (Math.abs(rotationAngle) > mMaxRotationAngle) {
            rotationAngle = rotationAngle < 0 ? -mMaxRotationAngle : mMaxRotationAngle;
        }
        transformImageBitmap((ImageView) child, t, rotationAngle);
    }

    return true;
}


 private void transformImageBitmap(final ImageView child, final Transformation t, final int rotationAngle) {
    mCamera.save();
    final Matrix imageMatrix = t.getMatrix();

    final int height = child.getLayoutParams().height;

    final int width = child.getLayoutParams().width;
    final int rotation = Math.abs(rotationAngle);

    mCamera.translate(0.0f, 0.0f, 100.0f);

    // As the angle of the view gets less, zoom in
    if (rotation < mMaxRotationAngle) {
        final float zoomAmount = (float) (mMaxZoom + rotation * 1.5);
        mCamera.translate(0.0f, 0.0f, zoomAmount);
    }

    mCamera.rotateY(rotationAngle);
    mCamera.getMatrix(imageMatrix);
    imageMatrix.preTranslate(-(width / 2.0f), -(height / 2.0f));
    imageMatrix.postTranslate((width / 2.0f), (height / 2.0f));
    mCamera.restore();
}

1 个答案:

答案 0 :(得分:0)

您可以使用coverFlow的 setOnItemSelectedListener 来实现此目的。请参阅下面的代码,您将获得中心图像的位置。

int sel_pos;

coverFlow.setOnItemSelectedListener(new SelectListener(this));

    private class SelectListener implements AdapterView.OnItemSelectedListener {

            public SelectListener(Context c) 
            {

            }

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

                Log.e("Changed----->", "" + position);

                // Zoom the new selected view
                try 
                {                               
                    sel_pos = position;             
                    coverImageAdapter.notifyDataSetChanged();

                } catch (Exception animate) 
                {

                }       

            }

            public void onNothingSelected(AdapterView<?> parent) {
            }

        }

现在,您可以在适配器的getview方法中将图像的焦点更改为coverFlow。

public View getView(int position, View convertView, ViewGroup parent)
    {
        // Use this code if you want to load from resources
        ImageView i = new ImageView(mContext);
        i.refreshDrawableState();
        Log.e("position==", ""+position);

        if(sel_pos==position)
        {
            i.setImageResource(selectedImage[position]);
        }
        else 
        {
            i.setImageResource(UnselectedImage[position]);

        }       


        i.setLayoutParams(new CoverFlow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);


        // Make sure we set anti-aliasing otherwise we get jaggies  
        BitmapDrawable drawable = (BitmapDrawable) i.getDrawable();
        drawable.setAntiAlias(true);
        return i;

    }

跳这会对你有帮助。