MainActivity.class

package com.example.imagedemotext;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.content.ContentResolver;
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.Images.Thumbnails;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView; public class MainActivity extends Activity {
Button btn_start;
GridView gridview; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_start = (Button) findViewById(R.id.btn_start);
gridview = (GridView) findViewById(R.id.gridview);
adapter = new Myadapter();
iniLisner();
inidata();
}
private void refreshAdapter(){
if(list == null){
list = new ArrayList<String>();
}
if(adapter == null){
adapter = new Myadapter();
}
if(list.size() == ON){
list.remove(list.size() - 1);
}
adapter.notifyDataSetChanged();
}
private final int ON = 5; //允许的图片数量 + 1
private void inidata() {
if(list == null){
list = new ArrayList<String>();
list.add("a"); //添加默认图片
}
gridview.setAdapter(adapter);
gridview.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(list.get(position).equals("a")){
setClick();
}
}
}); refreshAdapter();
} Myadapter adapter;
class Myadapter extends BaseAdapter{
@Override
public int getCount() {return list.size();}
@Override
public Object getItem(int position) {return null;}
@Override
public long getItemId(int position) {return 0;}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh = null;
if(convertView == null){
convertView = View.inflate(getApplicationContext(), R.layout.item, null);
vh = new ViewHolder();
vh.iamge = (ImageView) convertView.findViewById(R.id.image);
convertView.setTag(vh);
}else {
vh = (ViewHolder) convertView.getTag();
}
if(list.get(position).equals("a")){ //添加默认图片
vh.iamge.setImageResource(R.drawable.ic_launcher);
}else {
Bitmap loacalBitmap = getLoacalBitmap(list.get(position));
if(loacalBitmap != null){
vh.iamge.setImageBitmap(loacalBitmap);
}
}
return convertView;
} }
class ViewHolder {
ImageView iamge;
} private void iniLisner() {
if(btn_start != null){
btn_start.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
setClick();
}
}); } } private void setClick(){
Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
getImage.addCategory(Intent.CATEGORY_OPENABLE);
getImage.setType("image/jpeg");
startActivityForResult(getImage, 0); }
private byte[] mContent;
private List<String> list;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ContentResolver resolver = getContentResolver();
if(data == null){
return;
}
if (requestCode == 0) {
try {
Uri originalUri = data.getData();
mContent = readStream(resolver.openInputStream(Uri.parse(originalUri.toString())));
String path = originalUri.toString();
ContentResolver testcr = getContentResolver();
Cursor cur = testcr.query(originalUri, null, null, null, null);
if(list.size() == ON){
removeItem();
refreshAdapter();
return;
}
removeItem();
for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
int dataColumn = cur.getColumnIndex(Thumbnails.DATA);
String image_path = cur.getString(dataColumn);
list.add(image_path);
}
list.add("a");
refreshAdapter(); } catch (Exception e) {
System.out.println(e.getMessage());
} } }
private void removeItem() {
if(list.size() -1 != ON){
if(list.size() != 0){ //删除默认图片
list.remove(list.size() - 1);
}
} }
public static byte[] readStream(InputStream inStream) throws Exception {
byte[] buffer = new byte[1024];
int len = -1;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inStream.close();
return data; }
public static Bitmap getLoacalBitmap(String url) {
try {
FileInputStream fis = new FileInputStream(url);
return BitmapFactory.decodeStream(fis);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
} }

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击按钮选择一个图片后会显示在下面的GridView" /> <Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取图片" /> <View
android:layout_width="match_parent"
android:layout_height="9dp"
android:background="#a0000000" /> <GridView
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</GridView> </LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" > <ImageView
android:id="@+id/image"
android:layout_width="40dp"
android:layout_height="40dp"
/> </LinearLayout>

Android模仿QQ空间图片上传——原理的更多相关文章

  1. 模拟QQ心情图片上传预览

    出于安全性能的考虑,目前js端不支持获取本地图片进行预览,正好在做一款类似于QQ心情的发布框,找了不少jquery插件,没几个能满足需求,因此自己使用SWFuplad来实现这个图片上传预览. 先粘上以 ...

  2. Android 模仿QQ空间风格的 UI(转)

    本文内容 环境 演示模仿QQ空间风格的UI 虽然这个 UI 跟现在的QQ空间有点差别,但是也能学到很多东西. 下载 Demo 环境 Windows 7 64 位 Eclipse ADT V22.6.2 ...

  3. Android 模仿QQ空间风格的 UI

    本文内容 环境 演示模仿QQ空间风格的UI 虽然这个 UI 跟现在的QQ空间有点差别,但是也能学到很多东西. 下载 Demo 环境 Windows 7 64 位 Eclipse ADT V22.6.2 ...

  4. HTTP上传 文件上传 图片上传 HTTP上传原理 文件上传原理 图片上传原理

    1.概述 在最初的http协议中,没有上传文件方面的功能.rfc1867(http://www.ietf.org/rfc/rfc1867.txt )为http协议添加了这个功能.浏览器按照此规范将用户 ...

  5. 微信小程序开发之多图片上传+服务端接收

    前言: 业务需求,这次需要做一个小程序同时选中三张图片一起上传到服务端,后端使用的.NET WEBAPI接收数据保存. 使用技术: 在这章中将会使用到微信小程序wx.uploadFile(Object ...

  6. 后台管理系统之“图片上传” --vue

    图片上传(基于vue) 相信上传图片是所有系统必备的功能吧,工作中的第一个管理系统就在上传图片的功能上卡顿了一整天. 当时用的elementUI组件,但是由于样式和设计图样式差别较大再加上原生相较好理 ...

  7. 使用Struts2实现图片上传和拦截器

    今天来分享一个图片上传 现在很多小项目里面基本上都有要显示图片的功能,所以呢图片上传是基本要掌握的啦 一般的图片上传原理就是从本地选择一张图片然后通过io流发布到服务器上去 上传方案基本有三种: 1. ...

  8. 前端js图片上传

    前端js图片上传,原理用input type="file"获取图片然后把图片转换成base64编码传到后台. 图片上传 <!DOCTYPE html><html& ...

  9. 安卓自定义View实现图片上传进度显示(仿QQ)

    首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看下图我们实现的效果: 实现原理很简单,首先我们上传图片时需要一个进度值progress,这个不管是自己写的上传的方法还是使用第三方 ...

随机推荐

  1. svnadmin:error while loading shared libraries: libaprutil-1.so.0:cannot open shared object file: No such file or directory

    wdcp下安装svn后一直提示 svnadmin:error while loading shared libraries: libaprutil-1.so.0:cannot open shared ...

  2. Java并发编程(二)线程任务的中断(interrupt)

    使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回. ...

  3. SQlServer 从系统表 sysobjects 中获取数据库中所有表或存储过程等对象

    [sysobjects] 一.概述 系统对象表. 保存当前数据库的对象,如约束.默认值.日志.规则.存储过程等,该表中包含该数据库中的表 存储过程 视图等所有对象 在sqlserver2005,sql ...

  4. C# IList<T>转为DataTable

    public class WebUtil { /// <summary> /// 转换IList<T>为DataTable/// </summary> /// &l ...

  5. JVM-对象的存活与死亡

    当Java虚拟机进行垃圾收集的时候,那么它必须要先判断对象,是否还存活,如果存活就不能对它进行回收.所以判断一个对象是否存活是Java虚拟机必须要实现的. 1.对象是否存活 1)引用计数器:给对象添加 ...

  6. poj2631 树的直径 + bfs

    //Accepted 492 KB 0 ms //树的直径 bfs #include <cstdio> #include <cstring> #include <iost ...

  7. Html.ActionLink , Url.Action

    也来总结一下 以后省的忘了 都是从controller中获取到action名字返回 html.actionlink 返回的是带<a> 标签的超链接 url.action 是返回正常cont ...

  8. UILabel自适应宽度的函数详解

    之前用Text Kit写Reader的时候,在分页时要计算一段文本的尺寸大小,之前使用了NSString类的sizeWithFont:constrainedToSize:lineBreakMode:方 ...

  9. BZOJ 4131 并行博弈

    发现必胜态只和(1,1)的状态有关. 无法得知必胜的方法,只知道谁会必胜. #include<iostream> #include<cstdio> #include<cs ...

  10. 【Tsinghua OJ】范围查询(Range)问题

    [问题描述]数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数. [输入]第一行包括两个整数:点的总数n,查询的次数m.第二行包含n个数,为各个点的坐标.以下m行,各包含两个整数:查询 ...