Coverflow с пользовательским адаптером

Я хочу создать обложку с помощью специального адаптера ("Просмотр изображения в виде эскиза", "Просмотр текста в качестве заголовка", "Индикатор выполнения", показывающий некоторый прогресс...)

Все примеры или реализации виджета "Обложка" основаны на приложении "Галерея" (ведьма поддерживает только коллекцию изображений).

Есть ли намеки, идеи, которые могут мне помочь?

Спасибо:)

4 ответа

Это довольно легко сделать; Вы используете тот же адаптер, что и, например, со списком. Расширить BaseAdapter, использовать ViewHolder шаблон и вернуть ваш раздутый вид в

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

метод. Но вы должны изменить

 transformImageBitmap(THIS child, Transformation t, int rotationAngle) 

в

transformImageBitmap(View child, Transformation t, int rotationAngle)

в CoverFlow.java или вы получите ClassCastExceptions,

Если вы хотите, чтобы прикрытие для всех представлений было возможно из соты, где вы можете вращать представления, используя метод View.setRotationY(вращение).

Вы можете сделать это с помощью ленивого адаптера. Вы должны создать отраженные изображения в файле декодирования класса Image Loader. Затем вы должны вернуть представление изображения из метода getview вашего пользовательского класса адаптера.

Вот пример кода:

In main activity:

CoverFlow coverflow=(CoverFlow)findViewById(R.id.yourcoverflowid);

coverflow.setAdapter(new customadapter(getActivity(),list,imagesize));

In getview method of custom adapter:

    ImageView i=new ImageView(activity);       
    imageLoader.DisplayImage(data.get(position).getimage(),i);


    i.setPadding(0,5,0,0);

    i.setLayoutParams(new CoverFlow.LayoutParams(width,height));

    i.setScaleType(ImageView.ScaleType.MATRIX);

    return i;

In decodefile method of imageloader class

try {final int отражение Gap = 4;

    Bitmap originalImage;


     BitmapFactory.Options o = new BitmapFactory.Options();
     o.inJustDecodeBounds = true;
     FileInputStream stream1=new FileInputStream(f);
     originalImage=BitmapFactory.decodeStream(stream1);
     stream1.close();

        int width = originalImage.getWidth();
        int height = originalImage.getHeight();


        //This will not scale but will flip on the Y axis
        Matrix matrix = new Matrix();
        matrix.preScale(1, -1);

        //Create a Bitmap with the flip matrix applied to it.
        //We only want the bottom half of the image
        Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height/2, width, height/2, matrix, false);


        //Create a new bitmap with same width but taller to fit reflection
        Bitmap bitmapWithReflection = Bitmap.createBitmap(width 
          , (height + height/2), Config.ARGB_8888);

       //Create a new Canvas with the bitmap that's big enough for
       //the image plus gap plus reflection
       Canvas canvas = new Canvas(bitmapWithReflection);
       //Draw in the original image
       canvas.drawBitmap(originalImage, 0, 0, null);
       //Draw in the gap
       Paint deafaultPaint = new Paint();
       canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);
       //Draw in the reflection
       canvas.drawBitmap(reflectionImage,0, height + reflectionGap, null);

       //Create a shader that is a linear gradient that covers the reflection
       Paint paint = new Paint(); 
       LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, 
         bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, 
         TileMode.CLAMP); 
       //Set the paint to use this shader (linear gradient)
       paint.setShader(shader); 
       //Set the Transfer mode to be porter duff and destination in
       paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
       //Draw a rectangle using the paint with our linear gradient
       canvas.drawRect(0, height, width, 
         bitmapWithReflection.getHeight() + reflectionGap, paint); 


    return bitmapWithReflection;

Обходное решение, которое я использовал, может быть не тем, что вам нужно. Однако это то, что я мог придумать... Я положил все, что я хочу в LinearLayout, а затем преобразовать его в Bitmap:

LayoutInflater inflater = (LayoutInflater) ClassifiedActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);              

LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.my_layout_as_imageview,
                null);
layout.setBackgroundResource(R.drawable.stub);

layout.setDrawingCacheEnabled(true);

layout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
layout.layout(0, 0, layout.getMeasuredWidth(), layout.getMeasuredHeight());

layout.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(layout.getDrawingCache());
layout.setDrawingCacheEnabled(false); // clear drawing cache

ImageView iv= (ImageView) findViewById(R.id.imageView1);
iv.setImageBitmap(b);

Мой макет XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Medium Text" />

</LinearLayout>

Этот ответ помог мне преобразовать LinearLayout к Bitmap,

Другие вопросы по тегам