【问题标题】:WebView: load image and fit to screen widthWebView:加载图像并适应屏幕宽度
【发布时间】:2014-11-03 11:56:10
【问题描述】:

我已经阅读了几个关于这个问题的帖子,但我发现了另一个奇怪的不当行为:

我创建了一个初始页数为 5 的 ViewPager。如果达到页数 2,

pagerAdapter.notifyDataSetChanged();

被调用。 片段都有自己的 id,从 1 开始计数。所以第一个片段获得第一,第二个片段获得第二,依此类推。 每个片段根据其 id 从网络服务器加载图像:

webView.loadUrl("http://myserver/" + id + ".jpg");

现在看来,有时图像大于设备的屏幕宽度。这就是我添加这些行的原因:

webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);

前 5 个元素看起来非常合适,但是当尝试滑动到下一个片段时,您必须先将 webview 向左滑动大约 3px,然后再次滑动,才能到达下一个片段。 我不知道为什么会这样,但是在最初的 5 张图像之后,它可以正常工作。也许这与一开始我告诉pageradapter有5个片段要显示,滚动后添加更多片段有关。以下这些片段不受此问题的影响。 这是第一个问题。

第二个问题是,在浏览完全正确显示的图像时,有时图像不会适合屏幕。我必须将屏幕转为横向并返回纵向,然后才能正确安装图像。 这怎么会发生,为什么在重绘屏幕时它会起作用,但不是在第一次尝试时?而且它似乎只是偶尔发生。

这是我的两个问题,第一个问题是前 5 个片段的错误拟合最小,第二个问题是滑动时有时不合适的图像,但在重绘屏幕时合适

这是我的主要活动:

public class MyActivity extends ActionBarActivity {

public static int NUM_PAGES = 5;

private ViewPager viewPager;
private CustomPagerAdapter pagerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    viewPager = (ViewPager)findViewById(R.id.activity_my_viewpager);

    pagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(pagerAdapter);
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {

        }

        @Override
        public void onPageSelected(int i) {
            if(NUM_PAGES - i <= 2) {
                NUM_PAGES+=3;
            }
            pagerAdapter.notifyDataSetChanged();
        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });
}

private class CustomPagerAdapter extends FragmentStatePagerAdapter {
    public CustomPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return ScreenFragment.create(position);
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }
}
}

这是片段类:

public class ScreenFragment extends Fragment {

public static final String ARG_PAGE = "ARG_PAGE";

private int pageNumber;

public static ScreenFragment create(int pageNumber) {
    ScreenFragment fragment = new ScreenFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, pageNumber);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    pageNumber = getArguments().getInt(ARG_PAGE)+1;
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.fragment_screen, container, false);
    WebView webView = (WebView)viewGroup.findViewById(R.id.fragment_screen_webview);
    webView.setWebViewClient(new WebViewClient());
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.loadUrl("http://someserver/" + Integer.toString(number) + ".jpg");
    return viewGroup;
}
}

提前致谢

【问题讨论】:

  • 请发布一些屏幕截图以便更好地理解.....

标签: android android-fragments webview


【解决方案1】:

您应该尝试膨胀 ImageView 布局而不是使用 WebView。 为每个页面添加 ImageView 时,您可以使用 AsyncTask 下载每个页面的图像。

请看这里:https://stackoverflow.com/a/2472175/3064486

您可以拥有一个仅包含具有 android:scaleType="fitXY""fitCenter" 的 ImageView 的布局,然后在适配器内的 onCreateView 中,您可以扩展此布局并使用 findViewById 在其中找到 ImageView。然后您可以按照此答案的建议使用img.setImageBitmap

【讨论】:

  • 服务器上有上千张图片,在每个fragment上绘制一张图片会不会占用太多内存?否则,这听起来像是一个不错的选择,谢谢
  • 嗯。我想你是对的。但是你确定 WebView 更高效吗?
  • 我认为这是最简单的方法,我已经尝试过类似的图像和位图,但我总是遇到 OutOfMemory 异常。我认为我的解决方案很好,只是这两个小问题需要解决
  • 你试过修改图片的质量吗?如果图像是可点击的,您也可以在 ViewPager 中使用质量较低的图像进行“预览”。
【解决方案2】:

也许这会对你有所帮助,

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多