Guten Tag,
ich habe hier ein 14 Zoll Tablet mit einer Auflösung von 1920*1080 stehen, für das ich unter anderem eine Gallerie erstellen möchte. Dabei habe ich bereits die ViewPager und das FragmentStatePagerAdapter für mich entdeckt. Allerdings stehe ich noch vor dem Problem, dass die Bilder beim Swipen etwas laggen. Es sieht einfach nicht smooth aus. In der Gallery App des Tablets funktioniert das aber, daher müsste es ja für mich auch machbar sein. Ich habe schon einige Performance Optimierungen mitgemacht, welche aber nicht viel geholfen haben (wenn überhaupt). Hier also der Code:
Der View pro Seite:
package com.mb.app.pfarrer.fotos;
import android.app.Fragment;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import com.mb.app.pfarrer.R;
import java.io.File;
public class FotoViewFragment extends Fragment {
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.imagesliderview, container, false);
((ImageView) rootView.findViewById(R.id.imageView8)).setImageBitmap(decodeSampledBitmap(1920 / 2, 1080 / 2, getArguments().getString("fotopath")));
this.rootView = rootView;
return rootView;
}
public static Bitmap decodeSampledBitmap(int reqWidth, int reqHeight, String path) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);
}
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 2;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
@Override
public void onDestroy()
{
super.onDestroy();
((ImageView) rootView.findViewById(R.id.imageView8)).setImageBitmap(null);
Log.i("Fragment", "zerstört");
}
}
Alles anzeigen
Das Layout mit dem Pager:
package com.mb.app.pfarrer.fotos;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mb.app.pfarrer.FileManager;
import com.mb.app.pfarrer.R;
import java.io.File;
/**
* Created by mberg on 03.11.2015.
*/
public class FotoPagerFragment extends Fragment implements View.OnClickListener {
File fotos[];
ScreenSlidePagerAdapter mAdapter;
ViewPager mPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fotoviewfragment, container, false);
fotos = FileManager.getFotos(getArguments().getString("albumname"));
Log.i("Length", fotos.length+"");
mAdapter = new ScreenSlidePagerAdapter(this.getActivity().getFragmentManager());
mPager = (ViewPager)rootView.findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
//mPager.setOffscreenPageLimit(fotos.length);
rootView.findViewById(R.id.foreward).setOnClickListener(this);
rootView.findViewById(R.id.backward).setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.foreward)
{
mPager.setCurrentItem(mPager.getCurrentItem()+1);
}
else
{
mPager.setCurrentItem(mPager.getCurrentItem()-1);
}
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
FotoViewFragment fvf;
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Bundle b = new Bundle();
b.putString("fotopath", fotos[position].getAbsolutePath());
fvf = new FotoViewFragment();
fvf.setArguments(b);
return fvf;
}
@Override
public int getCount() {
return fotos.length;
}
}
}
Alles anzeigen
Ich habe auch den inSampleSize Wert schon mal vergrößert (bis 16), was aber von Swipen her keinen Unterschied gemacht hat.
Habt ihr noch Ideen? Ist da ein totaler Performance Killer drinne?`
Hardware Acceleration ist bereits eingeschaltet.