仿QQ 聊天 圖片功能UI

QQ發送圖片的UI及部分功能

1、暫時用activity 代替彈出框 本文只提供思路 並未完全實現。

package com.zhx.qqpictrue.ui;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Gallery;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

import com.zhx.qqpictrue.R;
import com.zhx.qqpictrue.adapter.QQGralleryAdapter;
import com.zhx.qqpictrue.bean.ImageFloder;

public class QQPictrueActivity extends Activity implements View.OnClickListener {
    private Gallery mRecyclerView;
    private QQGralleryAdapter mAdapter;
    private List<String> mDatas;
    private ProgressDialog mProgressDialog;

    /**
     * 存儲文件夾中的圖片數量
     */
    private int mPicsSize;
    /**
     * 圖片數量最多的文件夾
     */
    private File mImgDir;
    /**
     * 所有的圖片
     */
    private List<String> mImgs;
    /**
     * 臨時的輔助類,用於防止同一個文件夾的多次掃描
     */
    private HashSet<String> mDirPaths = new HashSet<String>();

    /**
     * 掃描拿到所有的圖片文件夾
     */
    private List<ImageFloder> mImageFloders = new ArrayList<ImageFloder>();

    int totalCount = 0;
    private TextView ablumTv, cameraTv, cacelTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        mRecyclerView = (Gallery) findViewById(R.id.id_recyclerview_horizontal);
        ablumTv = (TextView) findViewById(R.id.album_tv);
        ablumTv.setOnClickListener(this);
        cameraTv = (TextView) findViewById(R.id.camera_tv);
        cameraTv.setOnClickListener(this);
        cacelTv = (TextView) findViewById(R.id.cacel_tv);
        cacelTv.setOnClickListener(this);

        new Thread(new Runnable() {
            @Override
            public void run() {
                getImages();
            }
        }).start();
    }

    private void getImages() {
        String firstImage = null;
        Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        ContentResolver mContentResolver = QQPictrueActivity.this
                .getContentResolver();

        // 只查詢jpeg和png的圖片
        Cursor mCursor = mContentResolver.query(mImageUri, null,
                MediaStore.Images.Media.MIME_TYPE + "=? or "
                        + MediaStore.Images.Media.MIME_TYPE + "=?",
                new String[] { "image/jpeg", "image/png" },
                MediaStore.Images.Media.DATE_MODIFIED);

        while (mCursor.moveToNext()) {
            // 獲取圖片的路徑
            String path = mCursor.getString(mCursor
                    .getColumnIndex(MediaStore.Images.Media.DATA));

            Log.e("TAG", path);
            // 拿到第一張圖片的路徑
            if (firstImage == null)
                firstImage = path;
            // 獲取該圖片的父路徑名
            File parentFile = new File(path).getParentFile();
            if (parentFile == null)
                continue;
            String dirPath = parentFile.getAbsolutePath();
            ImageFloder imageFloder = null;
            // 利用一個HashSet防止多次掃描同一個文件夾(不加這個判斷,圖片多起來還是相當恐怖的~~)
            if (mDirPaths.contains(dirPath)) {
                continue;
            } else {
                mDirPaths.add(dirPath);
                // 初始化imageFloder
                imageFloder = new ImageFloder();
                imageFloder.setDir(dirPath);
                imageFloder.setFirstImagePath(path);
            }

            int picSize = parentFile.list(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String filename) {
                    if (filename.endsWith(".jpg") || filename.endsWith(".png")
                            || filename.endsWith(".jpeg"))
                        return true;
                    return false;
                }
            }).length;
            totalCount += picSize;

            imageFloder.setCount(picSize);
            mImageFloders.add(imageFloder);

            if (picSize > mPicsSize) {
                mPicsSize = picSize;
                // 顯示掃描到的第一個文件目錄
                if (mImgDir == null) {
                    mImgDir = parentFile;
                }
            }
        }
        mCursor.close();

        // 掃描完成,輔助的HashSet也就可以釋放內存了
        mDirPaths = null;

        // 通知Handler掃描圖片完成
        mHandler.sendEmptyMessage(0x110);
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (mImgDir == null) {
                Toast.makeText(getApplicationContext(), "擦,一張圖片沒掃描到",
                        Toast.LENGTH_SHORT).show();
                return;
            }

            mImgs = Arrays.asList(mImgDir.list());
            Collections.reverse(mImgs);
            mAdapter = new QQGralleryAdapter(QQPictrueActivity.this, mImgs,
                    R.layout.grid_item, mImgDir.getAbsolutePath());
            mRecyclerView.setAdapter(mAdapter);
        }
    };

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.album_tv:
            startActivity(new Intent(this, MainActivity.class));
            break;
        case R.id.camera_tv:
            startActivity(new Intent(this, ZCameraBaseAcitivy.class));
            break;
        case R.id.cacel_tv:
            finish();
            break;
        }
    }
}

2、配置文件xml

<?xml version="1.0"?>

-<RelativeLayout android:layout_height="match_parent" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">


-<LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="vertical" android:background="#333333" android:layout_alignParentBottom="true">

<Gallery android:layout_height="120dp" android:layout_width="match_parent" android:layout_marginBottom="1dp" android:spacing="5dp" android:scrollbars="none" android:layout_gravity="bottom" android:id="@+id/id_recyclerview_horizontal"/>

<TextView android:layout_height="wrap_content" android:layout_width="match_parent" android:background="#ffffff" android:layout_marginBottom="1dp" android:id="@+id/camera_tv" android:textSize="22sp" android:padding="10dp" android:textColor="#333333" android:gravity="center" android:text="相機"/>

<TextView android:layout_height="wrap_content" android:layout_width="match_parent" android:background="#ffffff" android:layout_marginBottom="1dp" android:id="@+id/album_tv" android:textSize="22sp" android:padding="10dp" android:textColor="#333333" android:gravity="center" android:text="相冊"/>

<TextView android:layout_height="wrap_content" android:layout_width="match_parent" android:background="#ffffff" android:id="@+id/cacel_tv" android:textSize="22sp" android:padding="10dp" android:textColor="#333333" android:gravity="center" android:text="取消"/>

</LinearLayout>

</RelativeLayout>
  1. 測試源碼 git地址:https://github.com/zhoulinxue/zhx_qq_pictrue.git
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章