源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

android ImageView 的几点经验总结

  • 时间:2020-01-06 10:48 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:android ImageView 的几点经验总结
最近作图片的显示,遇到了些问题,简单总结 [b]1)[/b]可以用ImageSwicher和ImageView结合在来做,这样会用到setFectory(),华而不实 最要命的是如果图片的大小超过屏幕,实现比较困难,目前是没有找到方法 [b]2)[/b]最简单的方法是用ImageView,图片直接FIT_CENTER,android会根据图片的大小自动调节 保持图片的比例。如果图片分辨率超过屏幕,android也会自动的调整到屏幕能放下整张的图片 在放大图片的时候,可以用ImageView的SetFrame() 和setScale()方法,可以把图片放大 到超过屏幕,原理就是ImageView放大,图片跟着放大。同时也是可以添加各种animation. [b]大致如下: [/b]
[u]复制代码[/u] 代码如下:
Animation animation = AnimationUtils.loadAnimation(Main.this, R.anim.my_scale_action); imageView.setLayoutParams(new Gallery.LayoutParams(206, 206)); imageView.startAnimation(animation);
写一个自己的MyImageView类,代码如下,可以直接用
[u]复制代码[/u] 代码如下:
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;      }         }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部