Android模仿QQ空间图片上传——原理
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空间图片上传——原理的更多相关文章
- 模拟QQ心情图片上传预览
出于安全性能的考虑,目前js端不支持获取本地图片进行预览,正好在做一款类似于QQ心情的发布框,找了不少jquery插件,没几个能满足需求,因此自己使用SWFuplad来实现这个图片上传预览. 先粘上以 ...
- Android 模仿QQ空间风格的 UI(转)
本文内容 环境 演示模仿QQ空间风格的UI 虽然这个 UI 跟现在的QQ空间有点差别,但是也能学到很多东西. 下载 Demo 环境 Windows 7 64 位 Eclipse ADT V22.6.2 ...
- Android 模仿QQ空间风格的 UI
本文内容 环境 演示模仿QQ空间风格的UI 虽然这个 UI 跟现在的QQ空间有点差别,但是也能学到很多东西. 下载 Demo 环境 Windows 7 64 位 Eclipse ADT V22.6.2 ...
- HTTP上传 文件上传 图片上传 HTTP上传原理 文件上传原理 图片上传原理
1.概述 在最初的http协议中,没有上传文件方面的功能.rfc1867(http://www.ietf.org/rfc/rfc1867.txt )为http协议添加了这个功能.浏览器按照此规范将用户 ...
- 微信小程序开发之多图片上传+服务端接收
前言: 业务需求,这次需要做一个小程序同时选中三张图片一起上传到服务端,后端使用的.NET WEBAPI接收数据保存. 使用技术: 在这章中将会使用到微信小程序wx.uploadFile(Object ...
- 后台管理系统之“图片上传” --vue
图片上传(基于vue) 相信上传图片是所有系统必备的功能吧,工作中的第一个管理系统就在上传图片的功能上卡顿了一整天. 当时用的elementUI组件,但是由于样式和设计图样式差别较大再加上原生相较好理 ...
- 使用Struts2实现图片上传和拦截器
今天来分享一个图片上传 现在很多小项目里面基本上都有要显示图片的功能,所以呢图片上传是基本要掌握的啦 一般的图片上传原理就是从本地选择一张图片然后通过io流发布到服务器上去 上传方案基本有三种: 1. ...
- 前端js图片上传
前端js图片上传,原理用input type="file"获取图片然后把图片转换成base64编码传到后台. 图片上传 <!DOCTYPE html><html& ...
- 安卓自定义View实现图片上传进度显示(仿QQ)
首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看下图我们实现的效果: 实现原理很简单,首先我们上传图片时需要一个进度值progress,这个不管是自己写的上传的方法还是使用第三方 ...
随机推荐
- mysql的binlog
mysql> show global variables like '%bin%'; +---------------------------------+------------------- ...
- HDU 3642 扫描线(立方体体积并)
Get The Treasury Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- winform的comboBox使鼠标滑轮修改值失效
目标: winform窗体很多combobox下拉框,当他们其中的一个获得焦点的时候,如果滚动鼠标就会改变下拉框的值,要实现让鼠标滚轮不对下拉框的值造成影响 如下代码直接拷贝粘贴,不用修改 方法一: ...
- RM报表预览,只有固定的1个订单页面
明明选了多个记录,预览时,只显示最后一个. 原因: 主项数据的数据集选了报表自带的虚拟数据集了.
- 【STL】-list的用法
初始化: #include <list> list<char> clist; 算法: clist.push_back(c); clist.remove('d'); 代码: #i ...
- jsp中普通按钮如何提交表单
jsp中普通按钮如何提交表单方法1: <form action = "提交的地址"> <input type="submit" ...
- STM32之延时秒,毫秒,微秒
#include "delay.h" #include "stdint.h" #include "stm32f10x.h" ; //us延时 ...
- MySQL表的增删改查和列的修改(二)
一.使用Like模糊查找搜索前缀为以“exam_”开头的表名 show tables like 'exam_%' ; 语句结束符号是:也是用\G来表示 二.MySQL表的CRUD 2.1 创建表: C ...
- 程序中double类型的数输出为什么要用lf
在c89和c++中double的输入和输入输出都用%lf 在c99中,double的输出必须用%f,而输入要用%lf oIER一般使用c++,所以输出直接%lf即可.
- ACM -二分图题目小结
暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063 过 ...