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
,