广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    android ImageView 的几点经验总结

    2018-04-08 09:03:13 次阅读 稿源:互联网
    广告

    最近作图片的显示,遇到了些问题,简单总结
    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类,代码如下,可以直接用
    代码如下:

    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; 
        }        

    }

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告