Android 使用ViewPager&x2B;放大图像视图

Android 使用ViewPager&x2B;放大图像视图,android,imageview,android-imageview,android-viewpager,Android,Imageview,Android Imageview,Android Viewpager,我想实施什么? 使用ViewPager的图像库。我选择这个选项是因为图像之间的平滑过渡(我使用的是ImageView),它很好而且很容易实现 我到底有什么问题? 我已经能够实现所有这些,但缩放不起作用。我可以在LogCat中看到它是如何打印的缩放(代码在文章末尾),但图像没有放大。请注意以下代码: ImageViewHelperURL.setUrlDrawable((ImageView)img,url,R.drawable.no_image)我正在使用从web异步下载图像 api.getLis

我想实施什么?

使用ViewPager的图像库。我选择这个选项是因为图像之间的平滑过渡(我使用的是ImageView),它很好而且很容易实现

我到底有什么问题?

我已经能够实现所有这些,但缩放不起作用。我可以在LogCat中看到它是如何打印的缩放(代码在文章末尾),但图像没有放大。请注意以下代码:

  • ImageViewHelperURL.setUrlDrawable((ImageView)img,url,R.drawable.no_image)我正在使用从web异步下载图像
  • api.getListUrls()
    这是一个ArrayList,其中包含图像URL
  • 我还尝试使用R.drawable中的ImageView,而不是下载图像

    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Matrix;
    import android.graphics.PointF;
    import android.os.Bundle;
    import android.support.v4.app.ActionBar;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.Menu;
    import android.support.v4.view.MenuItem;
    import android.support.v4.view.ViewPager;
    import android.util.FloatMath;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.MenuInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.Gallery;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    public class Slide extends FragmentActivity {
        private ViewPager mPager;
        public static Api api;
        public static int POSITION;
        public static ActionBar topbar;
        public static Context ctx;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fragment);
            ctx = Slide.this;
            POSITION = 0;
            topbar = getSupportActionBar();
    
            /* get portadas */
            api = new Api();
            api.getUrlsFromAPI();
    
            topbar.setDisplayShowHomeEnabled(false);
            topbar.setDisplayShowTitleEnabled(true);
    
            mPager = (ViewPager) findViewById(R.id.pager);
            mPager.setAdapter(new TestAdapter(getSupportFragmentManager()));
        }
    
        @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
            mPager.setCurrentItem(POSITION);
        }
    
        static final class TestAdapter extends FragmentPagerAdapter {
            public TestAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public int getCount() {
                return api.getListUrls().size();
            }
    
            @Override
            public Fragment getItem(int position) {
                TestFragment f = new TestFragment();
    
                f.url = api.getListUrls().get(position).getUrl();
                f.position = position;
                return f;
            }
        }
    
        public static class TestFragment extends Fragment {
            String url = "";
            Integer position = 0;
    
            public TestFragment() {
                setRetainInstance(true);
            }
    
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setHasOptionsMenu(true);
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                ImageView img = new ImageView(getActivity());
    
                img.setPadding(6, 6, 6, 6) ;
                img.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)) ;
    
                ImageViewHelperURL.setUrlDrawable((ImageView) img, url, R.drawable.no_image) ;
    
                img.setOnTouchListener(new OnTouchListener() {
                    private static final String TAG = "SlideImageView";
                    // These matrices will be used to move and zoom image
                    Matrix matrix = new Matrix();
                    Matrix savedMatrix = new Matrix();
    
                    // We can be in one of these 3 states
                    static final int NONE = 0;
                    static final int DRAG = 1;
                    static final int ZOOM = 2;
                    int mode = NONE;
    
                    // Remember some things for zooming
                    PointF start = new PointF();
                    PointF mid = new PointF();
                    float oldDist = 1f;
    
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        ImageView view = (ImageView) v;
    
                        // Dump touch event to log
                        dumpEvent(event);
    
                        // Handle touch events here...
                        switch (event.getAction() & MotionEvent.ACTION_MASK) {
                        case MotionEvent.ACTION_DOWN:
                            savedMatrix.set(matrix);
                            start.set(event.getX(), event.getY());
                            Log.d(TAG, "mode=DRAG");
                            mode = DRAG;
                            break;
                        case MotionEvent.ACTION_POINTER_DOWN:
                            oldDist = spacing(event);
                            Log.d(TAG, "oldDist=" + oldDist);
                            if (oldDist > 10f) {
                                savedMatrix.set(matrix);
                                midPoint(mid, event);
                                mode = ZOOM;
                                Log.d(TAG, "mode=ZOOM");
                            }
                            break;
                        case MotionEvent.ACTION_UP:
                        case MotionEvent.ACTION_POINTER_UP:
                            mode = NONE;
                            Log.d(TAG, "mode=NONE");
                            break;
                        case MotionEvent.ACTION_MOVE:
                            if (mode == DRAG) {
                                // ...
                                matrix.set(savedMatrix);
                                matrix.postTranslate(event.getX() - start.x,
                                        event.getY() - start.y);
                            } else if (mode == ZOOM) {
                                float newDist = spacing(event);
                                Log.d(TAG, "newDist=" + newDist);
                                if (newDist > 10f) {
                                    matrix.set(savedMatrix);
                                    float scale = newDist / oldDist;
                                    Log.d(TAG, "ZOOOOOOOM: " + scale);
                                    matrix.postScale(scale, scale, mid.x, mid.y);
                                }
                            }
                            break;
                        }
    
                        view.setImageMatrix(matrix);
                        return true; // indicate event was handled
                    }
    
                    /** Show an event in the LogCat view, for debugging */
                    private void dumpEvent(MotionEvent event) {
                        String names[] = { "DOWN", "UP", "MOVE", "CANCEL",
                                "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?",
                                "8?", "9?" };
                        StringBuilder sb = new StringBuilder();
                        int action = event.getAction();
                        int actionCode = action & MotionEvent.ACTION_MASK;
                        sb.append("event ACTION_").append(names[actionCode]);
                        if (actionCode == MotionEvent.ACTION_POINTER_DOWN
                                || actionCode == MotionEvent.ACTION_POINTER_UP) {
                            sb.append("(pid ").append(
                                    action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
                            sb.append(")");
                        }
                        sb.append("[");
                        for (int i = 0; i < event.getPointerCount(); i++) {
                            sb.append("#").append(i);
                            sb.append("(pid ").append(event.getPointerId(i));
                            sb.append(")=").append((int) event.getX(i));
                            sb.append(",").append((int) event.getY(i));
                            if (i + 1 < event.getPointerCount())
                                sb.append(";");
                        }
                        sb.append("]");
                        Log.d(TAG, sb.toString());
                    }
    
                    /** Determine the space between the first two fingers */
                    private float spacing(MotionEvent event) {
                        float x = event.getX(0) - event.getX(1);
                        float y = event.getY(0) - event.getY(1);
                        return FloatMath.sqrt(x * x + y * y);
                    }
    
                    /** Calculate the mid point of the first two fingers */
                    private void midPoint(PointF point, MotionEvent event) {
                        float x = event.getX(0) + event.getX(1);
                        float y = event.getY(0) + event.getY(1);
                        point.set(x / 2, y / 2);
                    }
                });
    
                return img;
            }
    
            @Override
            public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    
            }
    
            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
    
                return super.onOptionsItemSelected(item);
            }
        }
    
    }
    
    导入android.content.Context;
    导入android.content.Intent;
    导入android.graphics.Matrix;
    导入android.graphics.PointF;
    导入android.os.Bundle;
    导入android.support.v4.app.ActionBar;
    导入android.support.v4.app.Fragment;
    导入android.support.v4.app.FragmentActivity;
    导入android.support.v4.app.FragmentManager;
    导入android.support.v4.app.FragmentPagerAdapter;
    导入android.support.v4.view.Menu;
    导入android.support.v4.view.MenuItem;
    导入android.support.v4.view.ViewPager;
    导入android.util.FloatMath;
    导入android.util.Log;
    导入android.view.LayoutInflater;
    导入android.view.MenuInflater;
    导入android.view.MotionEvent;
    导入android.view.view;
    导入android.view.view.OnTouchListener;
    导入android.view.ViewGroup;
    导入android.view.ViewGroup.LayoutParams;
    导入android.widget.Gallery;
    导入android.widget.ImageView;
    导入android.widget.Toast;
    公开课幻灯片扩展了碎片活动{
    私人寻呼机;
    公共静态Api;
    公共静态位置;
    公共静态操作栏顶栏;
    公共静态上下文;
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment);
    ctx=幻灯片。这是;
    位置=0;
    topbar=getSupportActionBar();
    /*获取portadas*/
    api=新api();
    api.getUrlsFromAPI();
    topbar.setDisplayShowHomeEnabled(假);
    topbar.setDisplayShowTitleEnabled(真);
    mPager=(ViewPager)findViewById(R.id.pager);
    setAdapter(newtestAdapter(getSupportFragmentManager());
    }
    @凌驾
    受保护的void onResume(){
    //TODO自动生成的方法存根
    super.onResume();
    mPager.setCurrentItem(位置);
    }
    静态最终类TestAdapter扩展FragmentPagerAdapter{
    公共测试适配器(碎片管理器fm){
    超级(fm);
    }
    @凌驾
    public int getCount(){
    返回api.getListUrls().size();
    }
    @凌驾
    公共片段getItem(int位置){
    TestFragment f=新的TestFragment();
    f、 url=api.getListUrls().get(position.getUrl();
    f、 位置=位置;
    返回f;
    }
    }
    公共静态类TestFragment扩展了片段{
    字符串url=“”;
    整数位置=0;
    公共测试片段(){
    setRetainInstance(真);
    }
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    设置选项菜单(真);
    }
    @凌驾
    创建视图上的公共视图(布局、充气机、视图组容器、,
    Bundle savedInstanceState){
    ImageView img=新的ImageView(getActivity());
    img.setPadding(6,6,6,6);
    img.setLayoutParams(新的Gallery.LayoutParams(LayoutParams.FILL\u父级,LayoutParams.FILL\u父级));
    ImageViewHelperURL.setUrlDrawable((ImageView)img,url,R.drawable.no_image);
    setOnTouchListener(新的OnTouchListener(){
    私有静态最终字符串TAG=“SlideImageView”;
    //这些矩阵将用于移动和缩放图像
    矩阵=新矩阵();
    矩阵savedMatrix=新矩阵();
    //我们可能处于这三种状态之一
    静态最终int NONE=0;
    静态最终整数阻力=1;
    静态最终整数缩放=2;
    int模式=无;
    //记住一些关于缩放的事情
    PointF start=新的PointF();
    PointF mid=新的PointF();
    浮动oldDist=1f;
    @凌驾
    公共布尔onTouch(视图v,运动事件){
    ImageView视图=(ImageView)v;
    //将触摸事件转储到日志
    dumpEvent(事件);
    //在这里处理触摸事件。。。
    开关(event.getAction()&MotionEvent.ACTION\u掩码){
    case MotionEvent.ACTION\u DOWN:
    savedMatrix.set(矩阵);
    set(event.getX(),event.getY());
    Log.d(标记“mode=DRAG”);
    模式=拖动;
    打破
    case MotionEvent.ACTION\u指针\u向下:
    oldDist=间距(事件);
    Log.d(标记“oldDist=“+oldDist”);
    如果(旧区>10f){
    savedMatrix.set(矩阵);
    中点(中点,事件);
    模式=缩放;
    Log.d(标记“mode=ZOOM”);
    }
    打破
    case MotionEvent.ACTION\u UP:
    case MotionEvent.ACTION\u指针\u向上:
    模式=N