android ImageView 几点总结
16lz
2021-01-23
最近作图片的显示,遇到了些问题,简单总结
1)可以用ImageSwicher和ImageView结合在来做,这样会用到setFectory(),华而不实
最要命的是如果图片的大小超过屏幕,实现比较困难,目前是没有找到方法
2) 最简单的方法是用ImageView,图片直接FIT_CENTER,android会根据图片的大小自动调节
保持图片的比例。如果图片分辨率超过屏幕,android也会自动的调整到屏幕能放下整张的图片
在放大图片的时候,可以用ImageView的SetFrame() 和setScale()方法,可以把图片放大
到超过屏幕,原理就是ImageView放大,图片跟着放大。同时也是可以添加各种animation.
大致如下:
Animation animation = AnimationUtils.loadAnimation(Main.this, R.anim.my_scale_action);
imageView.setLayoutParams(new Gallery.LayoutParams(206, 206));
imageView.startAnimation(animation);
写一个自己的MyImageView类,代码如下,可以直接用,特别感谢
http://blog.csdn.net/ldj299/article/details/6422547
package com.practice.imageviewpic; import android.app.Activity; import android.content.Context; import android.graphics.*; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent; import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.Button;import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; //创建一个自己的ImageView类 class MyImageView extends ImageView { private float scale = 0.1f; //两点触屏后之间的长度 private float beforeLenght; private float afterLenght; //单点移动的前后坐标值 private float afterX,afterY; private float beforeX,beforeY; public MyImageView(Context context) { super(context); } public MyImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } //用来设置ImageView的位置 private void setLocation(int x,int y) { this.setFrame(this.getLeft()+x, this.getTop()+y, this.getRight()+x, this.getBottom()+y); } /* * 用来放大缩小ImageView * 因为图片是填充ImageView的,所以也就有放大缩小图片的效果 * flag为0是放大图片,为1是小于图片 */ public void setScale(float temp,int flag) { if(flag==0) { this.setFrame(this.getLeft()-(int)(temp*this.getWidth()), this.getTop()-(int)(temp*this.getHeight()), this.getRight()+(int)(temp*this.getWidth()), this.getBottom()+(int)(temp*this.getHeight())); }else { this.setFrame(this.getLeft()+(int)(temp*this.getWidth()), this.getTop()+(int)(temp*this.getHeight()), this.getRight()-(int)(temp*this.getWidth()), this.getBottom()-(int)(temp*this.getHeight())); } } //绘制边框 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Rect rec=canvas.getClipBounds(); rec.left++; rec.top++; rec.bottom--; rec.right--; Paint paint=new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); canvas.drawRect(rec, paint); } /* 让图片跟随手指触屏的位置移动 * beforeX、Y是用来保存前一位置的坐标 * afterX、Y是用来保存当前位置的坐标 * 它们的差值就是ImageView各坐标的增加或减少值 */ public void moveWithFinger(MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: //Log.d(TAG, "down .."); beforeX = event.getX(); beforeY = event.getY(); break; case MotionEvent.ACTION_MOVE: //Log.d(TAG, "move .."); afterX = event.getX(); afterY = event.getY(); this.setLocation((int)(afterX-beforeX),(int)(afterY-beforeY)); beforeX = afterX; beforeY = afterY; break; case MotionEvent.ACTION_UP: //Log.d(TAG, "up .."); break; } } /* * 通过多点触屏放大或缩小图像 * beforeLenght用来保存前一时间两点之间的距离 * afterLenght用来保存当前时间两点之间的距离 */ public void scaleWithFinger(MotionEvent event) { float moveX = event.getX(1) - event.getX(0); float moveY = event.getY(1) - event.getY(0); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: beforeLenght = (float) Math.sqrt( (moveX*moveX) + (moveY*moveY) ); break; case MotionEvent.ACTION_MOVE: //得到两个点之间的长度 afterLenght = (float) Math.sqrt( (moveX*moveX) + (moveY*moveY) ); float gapLenght = afterLenght - beforeLenght; if(gapLenght == 0) { break; } //如果当前时间两点距离大于前一时间两点距离,则传0,否则传1 if(gapLenght>0) { this.setScale(scale,0); }else { this.setScale(scale,1); } beforeLenght = afterLenght; break; } } //这里来监听屏幕触控时间 @Override public boolean onTouchEvent(MotionEvent event) { /* * 判定用户是否触摸到了图片 * 如果是单点触摸则调用控制图片移动的方法 * 如果是2点触控则调用控制图片大小的方法 */ if(event.getY() > this.getTop() && event.getY() < this.getBottom() && event.getX() > this.getLeft() && event.getX() < this.getRight()) { if(event.getPointerCount() == 2) { this.scaleWithFinger(event); }else if(event.getPointerCount() == 1) { this.moveWithFinger(event); } } return true; } }
更多相关文章
- Android实现宫格图片连续滑动效果
- Android之UI学习篇六:ImageView实现图片旋转和缩放
- 快速开发框架Afinal的使用(数据库操作,HTTP请求,网络图片加载,控件绑
- Android bitmap图片处理
- Android 中,应用程序需要的图片资源如何针对不同屏幕大小手机设计