Android仿百度图片查看功能

我们知道,进入百度图片后,输入一个关键字后,首先看到的是很多缩略图,当我们点击某张缩略图时,我们就可以进入到大图显示页面,在大图显示页面,中包含了一个图片画廊,同时当前大图为刚刚我们点击的那张图片。现在我们看看在Android中如何实现类似的效果:

首先,我们需要有一个控件来显示缩略图,这里没有什么比GridView更加合适了。

配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  <GridView
    android:id="@+id/view_photos"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginTop="10dp"
    android:columnWidth="100dp"
    android:numColumns="auto_fit"
    android:horizontalSpacing="5dp"
    android:verticalSpacing="5dp"
    android:listSelector="@drawable/frame_select" />
</LinearLayout>

对于GridView中每一项是一张缩略图,我们需要继承BaseAdapter,实现自己的一个GridImageAdapter,代码:

package com.liner.manager;
import java.util.List;
import com.liner.manager.adapter.GridImageAdapter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.ImageButton;
import android.widget.AdapterView.OnItemClickListener;
public class GalleryActivity extends Activity{ 

  private ImageButton currentImage;
  private Gallery gallery; 

  private int[] thumbIds;
  private int currentPos; 

  private Bitmap currentBitmap; 

  private List<Bitmap> bitmapCache; 

  public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallery); 

    currentImage = (ImageButton)this.findViewById(R.id.image_current);
    gallery = (Gallery)this.findViewById(R.id.image_gallery);
    gallery.setOnItemClickListener(galleryItemClickListener);
    init();
  } 

  private OnItemClickListener galleryItemClickListener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> p, View v, int position,
        long id) {
      // 点击事件
      showCurrentImage(position);
    }
  }; 

  private void init(){
    thumbIds = this.getIntent().getIntArrayExtra("thumbIds");
    currentPos = this.getIntent().getIntExtra("currentPos",0);
    //galleryIds = this.getThumbnailIds(currentPos); //当前的gallery里的图片信息
    bitmapCache = BitmapUtils.queryThumbnailListByIds(this, thumbIds);
    GridImageAdapter adapter = new GridImageAdapter(this.getApplication(), bitmapCache);
    gallery.setAdapter(adapter);
    gallery.setSelection(currentPos); 

    showCurrentImage(currentPos); 

  } 

  private void showCurrentImage(int position){ 

    if(currentBitmap != null){
      currentBitmap.recycle();
    } 

    currentBitmap = BitmapUtils.queryImageByThumbnailId(GalleryActivity.this, thumbIds[position]);
    if(currentBitmap != null){
      currentImage.setImageBitmap(currentBitmap);
    }else{
      //什么都不做
    } 

    //releaseBitmaps();
  } 

  /**
   * 将Gallery当前可见的显示之前的3张,后3张缓存起来,其余的释放掉,这样是为了放置内存不够用
   * 之所以前三张后三张,是为了Gallery可以滑动的更加顺畅
   */
  private void releaseBitmaps(){
    int start = gallery.getFirstVisiblePosition()-3; //缓存的起始位置
    int end = gallery.getLastVisiblePosition()+3; //缓存的结束位置 

    Bitmap delBitmap;
    for(int i=0; i<start; i++){
      delBitmap = bitmapCache.get(i);
      if(delBitmap != null){
        bitmapCache.remove(i);
        delBitmap.recycle();
      }
    }
    for(int i=end+1; i<bitmapCache.size(); i++){
      delBitmap = bitmapCache.get(i);
      if(delBitmap != null){
        bitmapCache.remove(i);
        delBitmap.recycle();
      }
    }
  } 

  /**
   * 获取当前位置的前三个Id和后三个Id
   * @param position
   * @return
   */
  private Integer[] getThumbnailIds(int position){
    Integer[] ids = new Integer[]{0,0,0,0,0,0,0};
    int currPos = 0;
    //关于这里的处理,比较复杂
    for(int i=3; i>0; i--){
      if(position - i >= 0){
        currPos = 3-i;
        ids[currPos] = thumbIds[position-i];
      }
    }
    ids[++currPos] = thumbIds[position]; //当前Id
    //currGallerySelection = currPos;
    //这样右边剩下的位置数就是7-currPos-1
    for(int i=1; i<=6-currPos;i++){
      if(position+i < thumbIds.length){
        ids[currPos+i] = thumbIds[position+i];
      }
    } 

    return ids;
  }
} 

然后,我们就可以在Activity中通过查询MediaStore的多媒体图片库来查询所有的图片的缩略图,缩略图所在的位置是:
MediaStore.Images.Thumbnails。Activity代码如下:

package com.liner.manager;
import java.util.ArrayList;
import java.util.List;
import com.liner.manager.adapter.GridImageAdapter;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
public class MainActivity extends Activity {
  private GridView photoView;
  private GridImageAdapter imageAdapter; 

  private Cursor cursor;
  private int[] thumbIds; 

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); 

    photoView = (GridView)this.findViewById(R.id.view_photos);
    photoView.setOnItemClickListener(photoClickListener); 

    //showImages();
    showThumbnails();
  } 

  private void showThumbnails(){ 

    cursor = BitmapUtils.queryThumbnails(this);
    if(cursor.moveToFirst()){
      List<Bitmap> bitmaps = new ArrayList<Bitmap>();
      thumbIds = new int[cursor.getCount()];
      for(int i=0; i<cursor.getCount();i++){
        cursor.moveToPosition(i);
        String currPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
        thumbIds[i] = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID));
        Bitmap b = BitmapUtils.decodeBitmap(currPath,100,100);
        bitmaps.add(b);
      }
      imageAdapter = new GridImageAdapter(this.getApplication(), bitmaps);
      photoView.setAdapter(imageAdapter);
    }
  } 

  private AdapterView.OnItemClickListener photoClickListener = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> p, View v, int position,
        long id) {
      //点击某张缩略图时,转到图片显示界面
      Intent intent = new Intent();
      intent.setClass(MainActivity.this, GalleryActivity.class);
      intent.putExtra("thumbIds", thumbIds);
      intent.putExtra("currentPos", position);
      startActivity(intent);
    }
  }; 

}

注意到,我们记录了,所有缩略图对应的id号,和当前的用户选择的位置,然后通过Intent传递到第二个展示界面。第二个界面的布局文件如下:我们用了一个Gallery和一个ImageButton来实现

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical">
  <Gallery
    android:id="@+id/image_gallery"
    android:layout_width="fill_parent"
    android:layout_height="100dp"
    />
  <ImageButton
    android:id="@+id/image_current"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:layout_marginTop="10dp"
    />
</LinearLayout>

然后,对应的Activity如下:

package com.liner.manager;
import java.util.List;
import com.liner.manager.adapter.GridImageAdapter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.ImageButton;
import android.widget.AdapterView.OnItemClickListener;
public class GalleryActivity extends Activity{ 

  private ImageButton currentImage;
  private Gallery gallery; 

  private int[] thumbIds;
  private int currentPos; 

  private Bitmap currentBitmap; 

  private List<Bitmap> bitmapCache; 

  public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallery); 

    currentImage = (ImageButton)this.findViewById(R.id.image_current);
    gallery = (Gallery)this.findViewById(R.id.image_gallery);
    gallery.setOnItemClickListener(galleryItemClickListener);
    init();
  } 

  private OnItemClickListener galleryItemClickListener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> p, View v, int position,
        long id) {
      // 点击事件
      showCurrentImage(position);
    }
  }; 

  private void init(){
    thumbIds = this.getIntent().getIntArrayExtra("thumbIds");
    currentPos = this.getIntent().getIntExtra("currentPos",0);
    //galleryIds = this.getThumbnailIds(currentPos); //当前的gallery里的图片信息
    bitmapCache = BitmapUtils.queryThumbnailListByIds(this, thumbIds);
    GridImageAdapter adapter = new GridImageAdapter(this.getApplication(), bitmapCache);
    gallery.setAdapter(adapter);
    gallery.setSelection(currentPos); 

    showCurrentImage(currentPos); 

  } 

  private void showCurrentImage(int position){ 

    if(currentBitmap != null){
      currentBitmap.recycle();
    } 

    currentBitmap = BitmapUtils.queryImageByThumbnailId(GalleryActivity.this, thumbIds[position]);
    if(currentBitmap != null){
      currentImage.setImageBitmap(currentBitmap);
    }else{
      //什么都不做
    } 

    //releaseBitmaps();
  } 

}

可以看到,当用户点击Gallery中某一项时,触发onItemClick事件,在其中,我们通过根据该缩略图对应的Image_ID来从MediaStore.Images.Media中查询该缩略图对应的大图。并在ImageButton中显示。

这里当图片很多时,可能会出现内存溢出,为了避免这种情况,可以更加Gallery的特点,使用缓存。保存当前可见的缩略图的前三个到后三个。其余的全部recycle。当用户点击Gallery的时候,在判断当前的位置,如果大于或小于某个值时,则重新更新缓存。这样保证内存中的缩略图的个数总是6+Gallery.getLastVisiblePosition-Gallery.getFirstVisiblePosition个。其实这就是浮动缓存窗口,一个固定大小窗口在整个坐标(全部缩略图)上游动。这里没有实现,以后待续。

同时,你可能已经注意到,程序中使用到了一个BitmapUtils类,这个类是封装了一系列对查询图片,并将其解析为Bitmap的类。

代码如下:

package com.liner.manager;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.util.Log;
public final class BitmapUtils { 

  public static Bitmap decodeBitmap(String path, int displayWidth, int displayHeight){
    BitmapFactory.Options op = new BitmapFactory.Options();
    op.inJustDecodeBounds = true;
    Bitmap bmp = BitmapFactory.decodeFile(path, op); //获取尺寸信息
    //获取比例大小
    int wRatio = (int)Math.ceil(op.outWidth/(float)displayWidth);
    int hRatio = (int)Math.ceil(op.outHeight/(float)displayHeight);
    //如果超出指定大小,则缩小相应的比例
    if(wRatio > 1 && hRatio > 1){
      if(wRatio > hRatio){
        op.inSampleSize = wRatio;
      }else{
        op.inSampleSize = hRatio;
      }
    }
    op.inJustDecodeBounds = false;
    bmp = BitmapFactory.decodeFile(path, op);
    return Bitmap.createScaledBitmap(bmp, displayWidth, displayHeight, true);
  } 

  /**
   * 采用复杂计算来决定缩放
   * @param path
   * @param maxImageSize
   * @return
   */
  public static Bitmap decodeBitmap(String path, int maxImageSize){
    BitmapFactory.Options op = new BitmapFactory.Options();
    op.inJustDecodeBounds = true;
    Bitmap bmp = BitmapFactory.decodeFile(path, op); //获取尺寸信息
    int scale = 1;
    if(op.outWidth > maxImageSize || op.outHeight > maxImageSize){
      scale = (int)Math.pow(2, (int)Math.round(Math.log(maxImageSize/(double)Math.max(op.outWidth, op.outHeight))/Math.log(0.5)));
    }
    op.inJustDecodeBounds = false;
    op.inSampleSize = scale;
    bmp = BitmapFactory.decodeFile(path, op);
    return bmp;
  } 

  public static Cursor queryThumbnails(Activity context){
    String[] columns = new String[]{
        MediaStore.Images.Thumbnails.DATA,
        MediaStore.Images.Thumbnails._ID,
        MediaStore.Images.Thumbnails.IMAGE_ID
    };
    return context.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, columns, null, null, MediaStore.Images.Thumbnails.DEFAULT_SORT_ORDER);
  } 

  public static Cursor queryThumbnails(Activity context, String selection, String[] selectionArgs){
    String[] columns = new String[]{
        MediaStore.Images.Thumbnails.DATA,
        MediaStore.Images.Thumbnails._ID,
        MediaStore.Images.Thumbnails.IMAGE_ID
    };
    return context.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, MediaStore.Images.Thumbnails.DEFAULT_SORT_ORDER);
  } 

  public static Bitmap queryThumbnailById(Activity context, int thumbId){
    String selection = MediaStore.Images.Thumbnails._ID + " = ?";
    String[] selectionArgs = new String[]{
      thumbId+""
    };
    Cursor cursor = BitmapUtils.queryThumbnails(context,selection,selectionArgs); 

    if(cursor.moveToFirst()){
      String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
      cursor.close();
      return BitmapUtils.decodeBitmap(path, 100, 100);
    }else{
      cursor.close();
      return null;
    }
  } 

  public static Bitmap[] queryThumbnailsByIds(Activity context, Integer[] thumbIds){
    Bitmap[] bitmaps = new Bitmap[thumbIds.length];
    for(int i=0; i<bitmaps.length; i++){
      bitmaps[i] = BitmapUtils.queryThumbnailById(context, thumbIds[i]);
    } 

    return bitmaps;
  } 

  /**
   * 获取全部
   * @param context
   * @return
   */
  public static List<Bitmap> queryThumbnailList(Activity context){
    List<Bitmap> bitmaps = new ArrayList<Bitmap>();
    Cursor cursor = BitmapUtils.queryThumbnails(context);
    for(int i=0; i<cursor.getCount(); i++){
      cursor.moveToPosition(i);
      String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA));
      Bitmap b = BitmapUtils.decodeBitmap(path, 100, 100);
      bitmaps.add(b);
    }
    cursor.close();
    return bitmaps;
  } 

  public static List<Bitmap> queryThumbnailListByIds(Activity context, int[] thumbIds){
    List<Bitmap> bitmaps = new ArrayList<Bitmap>();
    for(int i=0; i<thumbIds.length; i++){
      Bitmap b = BitmapUtils.queryThumbnailById(context, thumbIds[i]);
      bitmaps.add(b);
    } 

    return bitmaps;
  }   

  public static Cursor queryImages(Activity context){
    String[] columns = new String[]{
        MediaStore.Images.Media._ID,
        MediaStore.Images.Media.DATA,
        MediaStore.Images.Media.DISPLAY_NAME
    };
    return context.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
  } 

  public static Cursor queryImages(Activity context, String selection, String[] selectionArgs){
    String[] columns = new String[]{
        MediaStore.Images.Media._ID,
        MediaStore.Images.Media.DATA,
        MediaStore.Images.Media.DISPLAY_NAME
    };
    return context.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
  } 

  public static Bitmap queryImageById(Activity context, int imageId){
    String selection = MediaStore.Images.Media._ID + "=?";
    String[] selectionArgs = new String[]{
        imageId + ""
    };
    Cursor cursor = BitmapUtils.queryImages(context, selection, selectionArgs);
    if(cursor.moveToFirst()){
      String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
      cursor.close();
      //return BitmapUtils.decodeBitmap(path, 260, 260);
      return BitmapUtils.decodeBitmap(path, 220); //看看和上面这种方式的差别,看了,差不多
    }else{
      cursor.close();
      return null;
    }
  } 

  /**
   * 根据缩略图的Id获取对应的大图
   * @param context
   * @param thumbId
   * @return
   */
  public static Bitmap queryImageByThumbnailId(Activity context, Integer thumbId){ 

    String selection = MediaStore.Images.Thumbnails._ID + " = ?";
    String[] selectionArgs = new String[]{
      thumbId+""
    };
    Cursor cursor = BitmapUtils.queryThumbnails(context, selection, selectionArgs); 

    if(cursor.moveToFirst()){
      int imageId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID));
      cursor.close();
      return BitmapUtils.queryImageById(context, imageId);
    }else{
      cursor.close();
      return null;
    }
  }
}

这样就实现了,类似百度图片浏览的效果。效果图如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 实现WebView点击图片查看大图列表及图片保存功能

    在日常开发过程中,有时候会遇到需要在app中嵌入网页,此时使用WebView实现效果,但在默认情况下是无法点击图片查看大图的,更无法保存图片.本文将就这一系列问题的实现进行说明. 图示: 项目的知识点: 加载网页后如何捕捉网页中的图片点击事件: 获取点击的图片资源后进行图片显示,获取整个页面所有的图片: 支持查看上下一张的图片以及对图片缩放显示: 对图片进行保存: 其他:图片缓存的处理(不用每次都重新加载已查看过的图片) 项目代码结构: 前期准备(添加权限.依赖和混淆设置): 添加权限: <us

  • Android 简单的图片查看器源码实现

    本文介绍了Android 简单的图片查看器源码实现,分享给大家,具体如下: public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建handler 对象 // private Handler handler = new Handler(){ // // //处理消息 // public void handleMessage(android.os.Message

  • Android编程实现网络图片查看器和网页源码查看器实例

    本文实例讲述了Android编程实现网络图片查看器和网页源码查看器.分享给大家供大家参考,具体如下: 网络图片查看器 清单文加入网络访问权限: <!-- 访问internet权限 --> <uses-permission android:name="android.permission.INTERNET"/> 界面如下: 示例: public class MainActivity extends Activity { private EditText image

  • Android 网络图片查看器与网页源码查看器

    在AndroidManifest.xml里面先添加权限访问网络的权限: <uses-permission android:name="android.permission.INTERNET"/> 效果图如下: 下面是主要代码: package com.hb.neting; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.ann

  • Android实现的可以调整透明度的图片查看器实例

    本文以实例讲解了基于Android的可以调整透明度的图片查看器实现方法,具体如下:  main.xml部分代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"

  • android网络图片查看器简单实现代码

    本文实例为大家分享了android网络图片查看器的具体代码,供大家参考,具体内容如下 效果图: 1.输入一个图片url 2.转换成bitmap位图 3.展示到ImageView上 xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t

  • Android仿微信朋友圈图片查看器

    再看文章之前,希望大家先打开自己的微信点到朋友圈中去,仔细观察是不是发现朋友圈里的有个"九宫格"的图片区域,点击图片又会跳到图片的详细查看页面,并且支持图片的滑动和缩放?这个功能是不是很常用呢?!那么我今天正好做了这个Demo,下面为大家讲解一下.首先按照惯例先看一下效果图吧,尤其不会录制gif动画(哎~没办法,模拟器不支持多点触控,刚好我的手机又没有Root,不能录屏,悲催啊,大家见谅,想要看真实效果的话,烦请移到文章最下方转载文章中进行源码下载,点击下载源码,运行后再看效果哈~~)

  • Android 网络图片查看显示的实现方法

    我们的应用或多或少都会从网络获取图片数据然后进行显示,下面就将实现一个这样的例子,获取网络中的图片! 首先:我们来看一下效果图 界面中有三个控件,一个EditText,一个Button,一个ImageView 1.下面是具体布局文件 <EditText android:id="@+id/picturepagh" android:layout_width="fill_parent" android:layout_height="wrap_content

  • Android仿百度图片查看功能

    我们知道,进入百度图片后,输入一个关键字后,首先看到的是很多缩略图,当我们点击某张缩略图时,我们就可以进入到大图显示页面,在大图显示页面,中包含了一个图片画廊,同时当前大图为刚刚我们点击的那张图片.现在我们看看在Android中如何实现类似的效果: 首先,我们需要有一个控件来显示缩略图,这里没有什么比GridView更加合适了. 配置文件如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout

  • Android仿微信图片上传带加号且超过最大数隐藏功能

    1.仿照微信空间上传图片,显示图片数量以及超过最大,上传按钮隐藏功能 2.上效果图 3.上代码,主要是Adapter类 /** * Created by zhangyinlei on 2018/3/2 0002. */ public class AlbumSelectedShowAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static int TYPE_ADD = 0;//添加图片 privat

  • Android实现图片查看功能

    一.效果图 二.支持功能 本地与网络图片 可用于各大图片加载框架(Fresco,Glide,Picasso) 图片缩放 放大后的图片惯性滑动 下拉缩小退出 三.核心实现方法 3.1 缩放 Matrix.postScale(float sx, float sy, float px, float py) 参数解析: sx: 目标宽度 / 现有宽度 sy: 目标高度 / 现有高度 (px,py): 缩放焦点坐标 使用示例: /** * 缩放手势监听 */ private ScaleGestureDet

  • Android仿百度谷歌搜索自动提示框AutoCompleteTextView简单应用示例

    本文实例讲述了Android仿百度谷歌搜索自动提示框AutoCompleteTextView简单应用.分享给大家供大家参考,具体如下: 现在我们上网几乎都会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android 里是如何实现的呢? 事实上,Android 的AutoCompleteTextView Widget ,只要搭配ArrayAdapter 就能设计同类似Google 搜索提示的效果. 本例子先在Layout 当中布局一个AutoCom

  • Android仿微信语音聊天功能

    本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.weichat; import java.io.File; import java.io.IOException; import java.util.UUID; import android.media.MediaRecorder; public class AudioManager { private

  • Android开发之图片旋转功能实现方法【基于Matrix】

    本文实例讲述了Android开发之图片旋转功能实现方法.分享给大家供大家参考,具体如下: 在Android中进行图像旋转需要使用Matrix,它包含了一个3*3的矩阵,专门用于进行图像变换匹配.Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作.Matrix没有机构体,它必须初始化,然后通过reset方法和set方法来实现. 首先介绍一下矩阵运算.加法和减法就不用说了,太简单了,对应位相加就好.图像处理,主要用到的是乘法 .下面是一个乘法的公式

  • 仿百度换肤功能的简单实例代码

    效果:(换肤出来一个div,选择你想要的图片,作为网页背景,保存) 要点:cookie保存状态 html代码: <body> <div id="header"> <div id="header_con"> <div class="dbg"><a href="javascript:;" onclick="showImgBox()">换肤</a&

  • Android仿百度外卖自定义下拉刷新效果

    现如今的APP各式各样,同样也带来了各种需求,一个下拉刷新都能玩出花样了,前两天订饭的时候不经意间看到了"百度外卖"的下拉刷新,今天的主题就是它–自定义下拉刷新动画. 看一下实现效果吧: 动画 我们先来看看Android中的动画吧: Android中的动画分为三种: Tween动画,这一类的动画提供了旋转.平移.缩放等效果. Alpha – 淡入淡出 Scale – 缩放效果 Roate – 旋转效果 Translate – 平移效果 Frame动画(帧动画),这一类动画可以创建一个D

  • JS实现仿百度文库评分功能

    百度文库分享平台大家都知道,今天小编通过一段实例代码给大家介绍基于js实现百度文库评分功能,先给大家展示效果图吧. 具体代码如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/

  • Android仿微信图片点击全屏效果

    废话不多说,先看下效果: 先是微信的 再是模仿的 先说下实现原理,再一步步分析 这里总共有2个Activity一个就是主页,一个就是显示我们图片效果的页面,参数通过Intent传送,素材内容均来自网络,(感谢聪明的蘑菇) 图片都是Glide异步下的,下的,下的重要的事情说三次,然后就是用动画做放大操作然后显示出来了(并没有做下载原图的实现,反正也是一样 下载下来Set上去而且动画都不需要更简便). OK,我们来看分析下 obj,目录下分别创建了2个对象,一个用来使用来处理显示页面的图片尺寸信息以

随机推荐