android ImageView 的几点经验总结

最近作图片的显示,遇到了些问题,简单总结
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; 
    }

}

(0)

相关推荐

  • Java程序员转Android开发必读经验一份

    啰哩啰嗦的说说Java和Android程序的区别: Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择.学安卓从事移动互联方向开发,学Java从事软件.网站开发.而安卓上的应用大多是Java编写的,所以建议在安卓前期的Java学习阶段中,要用心学好. 言简意赅的说说"转"前的准备: 其实Java程序员要自学安卓开发的基础知识还是没有什么难度的,毕竟语言相通,特性相似,阅读安卓源代码的门槛以比较低一些,作为能够考虑"转&

  • Java经验点滴:处理没有被捕获的异常

    文章来源:csdn 作者:enoeht 在我们的程序中并不是所有的异常都被捕获,有些是因为我们不想捕获,因为我们认为那些异常没必要捕获 而有些是我们无法捕获的,因为我们不能确定它们会在什么地方出现,例如像NullPointerException,ClassCastException,IndexOutOfBoundsException这些RuntimeException.我们也许可以在所有它们有可能发生的地方去捕获它们,但这确实是很坏的解决方案.但在有些情况下,我们又必须在一些未捕获的异常发生时做

  • Android 日常开发总结的60条技术经验

    1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效. 2. 数据库表段字段常量和SQL逻辑分离,更清晰,建议使用Lite系列框架LiteOrm库,超级清晰且重心可以放在业务上不用关心数据库细节. 3. 全局变量放全局类中,模块私有放自己的管理类中,让常量清晰且集中. 4. 不要相信庞大的管理类的东西会带来什么好处,可能是一场灾难,而要时刻注意单一职责原则,一个类专心做好一件事情更为清晰. 5. 如

  • Android 自动化测试经验分享 UiObejct.getFromParent()的使用方法

    1. UiObejct.getFromParent()的用法:从这个名字就知道,就是从当前对象的父对象中查找想要的子对象,该子对象和当前对象应该是同一层级. 如上图所示:Max inactivity before lock是已知条件,4 minutes是我想动态获取的内容.那应该怎么做呢? 先看看结构:TableLayout(curent index is 2) - TableRow(has several indexes) - TextView(has 2 indexes). 1.先获取Tab

  • Android 自动化测试经验分享 深入UiScrollable

    UiScrollable is a UiCollection and provides support for searching for items in a scrollable user interface (UI) elements. This class can be used with horizontally or vertically scrollable controls. UiScrollable是一个UiCollection(这东西还没搞懂),我们可以使用它,在可滑动的页面

  • Java经验点滴:类注释文档编写方法

    文章来源:csdn 作者:chensheng913 对于Java语言,最体贴的一项设计就是它并没有打算让人们为了写程序而写程序--人们也需要考虑程序的文档化问题.对于程序的文档化,最大的问题莫过于对文档的维护.若文档与代码分离,那么每次改变代码后都要改变文档,这无疑会变成相当麻烦的一件事情. 解决的方法看起来似乎很简单:将代码同文档"链接"起来.为达到这个目的,最简单的方法是将所有内容都置于同一个文件.然而,为使一切都整齐划一,还必须使用一种特殊的注释语法,以便标记出特殊的文档:另外还

  • 总结Java集合类操作优化经验

    在实际的项目开发中会有很多的对象,如何高效.方便地管理对象,成为影响程序性能与可维护性的重要环节.Java 提供了集合框架来解决此类问题,线性表.链表.哈希表等是常用的数据结构,在进行 Java 开发时,JDK 已经为我们提供了一系列相应的类来实现基本的数据结构,所有类都在 java.util 这个包里,清单1 描述了集合类的关系. 清单 1.集合类之间关系 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map

  • 30条Java代码编写经验分享

    成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的.下面就让我们来看看代码编写的30条建议吧. (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如: ThisIsAClassName thisIsMethodOrFieldName 若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母.这样便可标志出它们属于编译期的常数. Java包(Package

  • android ImageView 的几点经验总结

    最近作图片的显示,遇到了些问题,简单总结1)可以用ImageSwicher和ImageView结合在来做,这样会用到setFectory(),华而不实最要命的是如果图片的大小超过屏幕,实现比较困难,目前是没有找到方法 2)最简单的方法是用ImageView,图片直接FIT_CENTER,android会根据图片的大小自动调节保持图片的比例.如果图片分辨率超过屏幕,android也会自动的调整到屏幕能放下整张的图片在放大图片的时候,可以用ImageView的SetFrame() 和setScale

  • Android ImageView 不显示JPEG图片的问题解决

    Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里需要设置成setVisibility(View.VISIBLE),但图片没有显示出来,换成PNG或其它的JPEG格式的图片确可以正常的显示. 原因:显示的图片大小为5.39K,图片格式有损坏,所以不能正常显示. 解决:换一张图片,或重新生成JPEG图片. 如果还是不能正常显示,建议在设置完VISIBLE后,调用如下方法: iv.setVisibility(

  • Android ImageView实现图片裁剪和显示功能

    首先在layout布局中设置按钮和一个ImageView <Button android:id="@+id/selectimagebtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择图片" /> <Button android:id="@+id/cutimagebt

  • Android ImageView的selector效果实例详解

    Android ImageView的selector效果实例详解 在平时开发中如Button我们给它加上selector分别呈现pressed以及normal效果能给我们的用户体验上大大增色不少,可是我们当我们是用ImageView来"当作"一个一个"Button"的时候发现直接设置selector却不起作用,当然此时我们的应用就表现的暗淡了.那我们就只能找到方法来解决这种情况. 首先定义一个selector文件: <selector xmlns:androi

  • Android ImageView 固定宽高比例的实现方法

    Android ImageView 固定宽高比例的实现方法 本文主要介绍 ImageView 固定宽高比例, 方法一:设置 adjustViewBounds="true", 方法二:使用 Universal-Image-Loader 图片缓存类,需要注意的是方法二和方法一同时使用导致设置无效. 方法一:设置 adjustViewBounds="true" <ImageView android:id="@+id/img_banner" and

  • android imageview图片居中技巧应用

    做UI布局,尤其是遇到比较复杂的多重LinearLayout嵌套,常常会被一些比较小的问题困扰上半天,比如今天在使用ImageView的时候,想让其居中显示,可是无论怎样设置layout_gravity属性,都无法达到效果,部分代码如下: [java] 复制代码 代码如下: <LinearLayout android:layout_width="wrap_content" android:layout_height="fill_parent" android:

  • android Imageview 图片覆盖具体实现

    复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gallerylayout" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Gallery android

  • Android ImageView随手势变化动态缩放图片

    在Android实际项目开发中,经常要用到ImageView这个组件,如果纯粹只是用来显示某一张图片,这个原生的组件是很方便的.但有时候为了效果更炫一点,比如很多软件都有的对图片的处理,随着手势的变化来拉大或缩小图片,这时就需要对原生的ImageView做一些处理来达到我们想要的效果. 原理就是Matrix 和PointF的运用,其实明白后一点都不难.我们需要写一个类继承ImageView来实现我们想要的功能,我这里演示的是类名是:ScaleImageView ,主要是重写onTouchEven

  • 实例解析Android ImageView的scaleType属性

    这篇随笔将会简单的记录下ImageView这个控件的一些使用方法,以及其最重要的一个属性: scaleType ImageView这个控件是用来显示图片用的,例如我们可以通过下面这段xml配置来声明显示一张图片: <ImageView android:id="@+id/imageView" android:layout_width="100dp" android:layout_height="100dp" android:src="

  • Android ImageView绘制圆角效果

    前言 Android 开发中,我们经常需要实现图片的圆形/圆角的效果,我们可以使用两种方式来实现这样的效果.一种是使用Xfermode,另一种是BitmapShader来实现.下面我将分别介绍这两种用法. 使用Xfermode的方式实现 使用该方式的关键代码,如下: private Bitmap creataBitmap(Bitmap bitmap) { //用指定的一个Bitmap来构建一个画布 Bitmap target = Bitmap.createBitmap(1000,1000, Bi

随机推荐