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