




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android中怎么實現(xiàn)微信朋友圈拍照上傳功能
Android中怎么實現(xiàn)微信朋友圈拍照上傳功能,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。1.PhotoPicker的使用這是一個支持選擇多張圖片,點擊圖片放大,圖片之間左右滑動互相切換的庫,同時支持圖片刪除的庫,效果類似微信。(1)添加PhotoPicker的架包(2)使用
選擇圖片:安卓6.0以后需要在代碼中添加讀寫sd卡和相機的權(quán)限當(dāng)然清單文件中也需要添加的
PhotoPicker.builder()
.setPhotoCount(maxPhoto)
//設(shè)置最多選擇的圖片數(shù)量
.setShowCamera(true)
//是否顯示相機按鈕
.setSelected(photos)
//設(shè)置已經(jīng)選好的圖片
.start(SendDynamicActivity.this);
//上下文參數(shù)
需要傳activity
查看圖片:PhotoPreview.builder()
.setPhotos(photos)
//設(shè)置選擇好的圖片
.setCurrentItem(position)
//設(shè)置當(dāng)前選擇的條目
.setShowDeleteButton(true)
//是否顯示刪除按鈕
.start(this);2.發(fā)布朋友圈頁面代碼比較簡單直接上package
com.zlc.friendcirclephoto.ui;
import
android.Manifest;
import
android.content.Intent;
import
android.os.Bundle;
import
android.support.v7.widget.RecyclerView;
import
android.support.v7.widget.StaggeredGridLayoutManager;
import
android.support.v7.widget.helper.ItemTouchHelper;
import
android.text.InputFilter;
import
android.view.View;
import
android.widget.ImageView;
import
android.widget.TextView;
import
com.mylhyl.acp.Acp;
import
com.mylhyl.acp.AcpListener;
import
com.mylhyl.acp.AcpOptions;
import
com.zlc.friendcirclephoto.adapter.MyItemTouchHelperCallback;
import
com.zlc.friendcirclephoto.adapter.SendImageAdapter;
import
com.zlc.friendcirclephoto.view.CommonEditText;
import
com.zlc.friendcirclephoto.R;
import
com.zlc.friendcirclephoto.utils.LogUtil;
import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.List;
import
me.iwf.photopicker.PhotoPicker;
import
me.iwf.photopicker.PhotoPreview;
/**
*
Created
by
zlc
*
發(fā)布朋友圈
*/
public
class
SendDynamicActivity
extends
BaseActivity
implements
View.OnClickListener,SendImageAdapter.OnClickListener{
private
ImageView
im_fanhui;
private
TextView
tv_title;
private
CommonEditText
id_et_content;
private
TextView
id_tv_num;
private
TextView
id_tv_max_num;
private
SendImageAdapter
mPhotoAdapter;
public
static
final
int
maxPhoto
=
9;
//最大選擇幾張照片
private
List<Object>
images
=
new
ArrayList<>();
private
ArrayList<String>
photos
=
new
ArrayList<>();
private
RecyclerView
mRecycleView;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_note);
initView();
initData();
initListener();
}
private
void
initView()
{
im_fanhui
=
findView(R.id.id_iv_back);
tv_title
=
findView(R.id.id_tv_title);
tv_title.setText("發(fā)布");
id_et_content
=
findView(R.id.id_common_et);
mRecycleView
=
findView(R.id.id_recycleview);
id_tv_num
=
findView(R.id.tv_num);
id_tv_max_num
=
findView(R.id.id_tv_max_num);
id_et_content.setHint("這一刻的想法");
id_tv_num.setText("0");
id_tv_max_num.setText("/188");
id_et_content.setFilters(new
InputFilter[]{new
InputFilter.LengthFilter(188)});
}
private
void
initData()
{
images.add(1);
mRecycleView.setLayoutManager(new
StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
mPhotoAdapter
=
new
SendImageAdapter(SendDynamicActivity.this,
images);
mRecycleView.setAdapter(mPhotoAdapter);
mPhotoAdapter.setOnClickListener(this);
MyItemTouchHelperCallback
callBack
=
new
MyItemTouchHelperCallback(mPhotoAdapter);
//實現(xiàn)拖拽排序
final
ItemTouchHelper
touchHelper
=
new
ItemTouchHelper(callBack);
//調(diào)用ItemTouchHelper的attachToRecyclerView方法建立聯(lián)系
touchHelper.attachToRecyclerView(mRecycleView);
}
private
void
initListener()
{
im_fanhui.setOnClickListener(this);
id_et_content.setOnTextChaged(new
CommonEditText.OnTextChaged()
{
@Override
public
void
setText(String
s)
{
id_tv_num.setText(s.length()+"");
}
});
}
@Override
public
void
onClick(View
v)
{
switch
(v.getId()){
case
R.id.id_iv_back:
finish();
break;
}
}
@Override
protected
void
onActivityResult(int
requestCode,
int
resultCode,
Intent
data)
{
super.onActivityResult(requestCode,
resultCode,
data);
if
(resultCode
==
RESULT_OK
&&
(requestCode
==
PhotoPicker.REQUEST_CODE
||
requestCode
==
PhotoPreview.REQUEST_CODE))
{
List<String>
photos
=
null;
if
(data
!=
null)
{
photos
=
data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS);
}
if
(photos
!=
null)
{
clearPhotoS(photos.size());
images.addAll(images.size()-1,photos);
mPhotoAdapter.notifyDataSetChanged();
}
}
}
@Override
public
void
onClick(View
v,
int
position)
{
switch
(v.getId()){
case
R.id.iv_add:
selectPhoto();
break;
case
R.id.im_delete:
delImages(position);
break;
case
R.id.iv_img:
lookPhoto(position);
break;
}
}
public
void
delImages(int
position){
images.remove(position);
if(mPhotoAdapter!=null)
mPhotoAdapter.notifyItemRemoved(position);
}
public
void
clearPhotoS(int
size){
LogUtil.e("返回有幾張照片",size+"");
images.clear();
images.add(1);
}
//選擇圖片
private
void
selectPhoto()
{
List<Object>
images
=
mPhotoAdapter.getDatas();
photos.clear();
for
(int
i
=
0;i<
images.size()-1;i++
){
photos.add(images.get(i).toString());
}
//權(quán)限
Acp.getInstance(this).request(new
AcpOptions.Builder()
.setPermissions(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE
)
.build(),
new
AcpListener()
{
@Override
public
void
onGranted()
{
LogUtil.e("msg",
"權(quán)限外全部通過");
PhotoPicker.builder()
.setPhotoCount(maxPhoto)
.setShowCamera(true)
.setSelected(photos)
.start(SendDynamicActivity.this);
}
@Override
public
void
onDenied(List<String>
permissions)
{
LogUtil.e(permissions.toString()
,"權(quán)限拒絕");
}
});
}
//查看圖片
private
void
lookPhoto(int
position){
photos.clear();
List<Object>
images
=
mPhotoAdapter.getDatas();
for
(int
i
=
0;i<
images.size()-1;i++
){
photos.add(images.get(i).toString());
}
PhotoPreview.builder()
.setPhotos(photos)
.setCurrentItem(position)
.setShowDeleteButton(true)
//是否顯示刪除按鈕
.start(this);
}
}3.圖片適配器代碼public
class
SendImageAdapter
extends
RecyclerView.Adapter<SendImageAdapter.ViewHolder>
implements
ItemTouchHelperAdapter{
private
Activity
mContext;
private
List<Object>
mDatas;
private
LayoutInflater
mLayoutInflater;
public
SendImageAdapter(Activity
context,List<Object>
datas){
this.mContext
=
context;
this.mDatas
=
datas;
mLayoutInflater
=
LayoutInflater.from(context);
}
@Override
public
SendImageAdapter.ViewHolder
onCreateViewHolder(ViewGroup
parent,
int
viewType)
{
View
view
=
mLayoutInflater.inflate(R.layout.send_grid_item,parent,false);
return
new
ViewHolder(view);
}
@Override
public
void
onBindViewHolder(final
SendImageAdapter.ViewHolder
viewHolder,
final
int
position)
{
Object
image
=
mDatas.get(position);
LinearLayout.LayoutParams
params
=
(LinearLayout.LayoutParams)
viewHolder.id_rl_img.getLayoutParams();
int
w
=
params.width
=
(int)
((ScreenUtil.getScreenWidth(mContext)
-
DensityUtil.dp2px(mContext,38))
/
3.0);
params.height
=
w;
params.bottomMargin
=
DensityUtil.dp2px(mContext,7);
params.rightMargin
=
DensityUtil.dp2px(mContext,7);
viewHolder.id_rl_img.setLayoutParams(params);
if
(image
instanceof
String)
{
viewHolder.im_delete.setVisibility(View.VISIBLE);
viewHolder.iv_add.setVisibility(View.GONE);
viewHolder.im_img.setVisibility(View.VISIBLE);
//這里最好使用glide
Picasso加載本地圖片
bitmap容易造成內(nèi)存溢出
Bitmap
bitmap
=
BitmapFactory.decodeFile(image.toString());
viewHolder.im_img.setImageBitmap(bitmap);
LogUtil.e("手機照片",
image.toString());
}
else
{
viewHolder.im_delete.setVisibility(View.INVISIBLE);
viewHolder.iv_add.setVisibility(View.VISIBLE);
viewHolder.im_img.setVisibility(View.GONE);
viewHolder.iv_add.setImageResource(R.drawable.tupiantianjia2x);
LogUtil.e("添加照片",
""+image);
}
viewHolder.iv_add.setOnClickListener(new
MyClickListener(viewHolder));
viewHolder.im_img.setOnClickListener(new
MyClickListener(viewHolder));
viewHolder.im_delete.setOnClickListener(new
MyClickListener(viewHolder));
}
@Override
public
int
getItemCount()
{
if(mDatas
==
null){
return
0;
}
return
mDatas.size()
>=
9
?
9
:
mDatas.size();
}
public
List<Object>
getDatas()
{
return
mDatas;
}
public
static
class
ViewHolder
extends
RecyclerView.ViewHolder{
private
final
ImageView
im_img;
private
final
ImageView
iv_add;
private
final
ImageView
im_delete;
private
final
FrameLayout
id_rl_img;
public
ViewHolder(View
itemView)
{
super(itemView);
im_img
=
(ImageView)
itemView.findViewById(R.id.iv_img);
iv_add
=
(ImageView)
itemView.findViewById(R.id.iv_add);
im_delete
=
(ImageView)
itemView.findViewById(R.id.im_delete);
id_rl_img
=
(FrameLayout)
itemView.findViewById(R.id.id_rl_img);
}
}
//拖拽排序相關(guān)
@Override
public
void
onItemMove(int
fromPos,
int
toPos)
{
if(fromPos
==
mDatas.size()-1
||
toPos
==
mDatas.size()-1
)
return;
Collections.swap(mDatas,fromPos,toPos);
notifyItemMoved(fromPos,toPos);
}
//滑動刪除相關(guān)
@Override
public
void
onItemDel(int
pos)
{
if(pos
==
mDatas.size()
-
1)
return;
mDatas.remove(pos);
notifyItemRemoved(pos);
}
public
interface
OnClickListener{
void
onClick(View
v,
int
position);
}
private
static
OnClickListener
onClickListener;
public
void
setOnClickListener(OnClickListener
onClickListener)
{
this.onClickListener
=
onClickListener;
}
public
static
class
MyClickListener
implements
View.OnClickListener{
private
ViewHolder
mHolder;
public
MyClickListener(ViewHolder
holder
){
this.mHolder
=
holder;
}
@Override
public
void
onClick(View
view)
{
switch
(view.getId()){
case
R.id.iv_add:
case
R.id.im_delete:
case
R.id.iv_img:
if(onClickListener!=null)
{
int
pos
=
mHolder.getAdapterPosition();
onClickListener.onClick(view,
pos);
}
break;
}
}
}
}4.拖拽排序(1)RecycleView通過ItemTouchHelper實現(xiàn)
MyItemTouchHelperCallback
callBack
=
new
MyItemTouchHelperCallback(mPhotoAdapter);
//實現(xiàn)拖拽排序
final
ItemTouchHelper
touchHelper
=
new
ItemTouchHelper(callBack);
//調(diào)用ItemTouchHelper的attachToRecyclerView方法建立聯(lián)系
touchHelper.attachToRecyclerView(mRecycleView);(2)MyItemTouchHelperCallback的自定義package
com.zlc.friendcirclephoto.adapter;
import
android.graphics.Canvas;
import
android.support.v7.widget.GridLayoutManager;
import
android.support.v7.widget.LinearLayoutManager;
import
android.support.v7.widget.RecyclerView;
import
android.support.v7.widget.StaggeredGridLayoutManager;
import
android.support.v7.widget.helper.ItemTouchHelper;
public
class
MyItemTouchHelperCallback
extends
ItemTouchHelper.Callback
{
private
SendImageAdapter
mAdapter;
//適配器傳過來
private
boolean
isLongDrag
=
true;
private
boolean
isMoveSwipe
=
true;
public
MyItemTouchHelperCallback(SendImageAdapter
adapter){
this.mAdapter
=
adapter;
}
@Override
public
int
getMovementFlags(RecyclerView
recyclerView,
RecyclerView.ViewHolder
viewHolder)
{
RecyclerView.LayoutManager
layoutManager
=
recyclerView.getLayoutManager();
int
dragFlags
=
0;
//拖拽的標(biāo)志
int
swipeFlags
=
0;
//刪除的標(biāo)志
int
position
=
viewHolder.getAdapterPosition();
if(position
==
mAdapter.getDatas().size()
-
1){
//
如果是最后一個條目
則既不能拖拽也不能刪除
dragFlags
=
0;
swipeFlags
=
0;
}
else
if(layoutManager
instanceof
GridLayoutManager
||
layoutManager
instanceof
StaggeredGridLayoutManager){//網(wǎng)格布局
則支持上下左右拖拽
不支持刪除
dragFlags
=
ItemTouchHelper.UP
|
ItemTouchHelper.DOWN
|
ItemTouchHelper.LEFT
|
ItemTouchHelper.RIGHT;
//允許上下左右的拖動
swipeFlags
=
0;
//不能刪除
}else
if(layoutManager
instanceof
LinearLayoutManager){
//線性布局分為垂直和水平
LinearLayoutManager
manager
=
(LinearLayoutManager)
layoutManager;
int
orientation
=
manager.getOrientation();
if(orientation
==
LinearLayoutManager.HORIZONTAL){
//橫向listview列表
dragFlags
=
ItemTouchHelper.LEFT
|
ItemTouchHelper.RIGHT;
//允許左右的拖動
swipeFlags
=
ItemTouchHelper.DOWN;
//只允許從上向下側(cè)滑
}else
if(orientation
==
LinearLayoutManager.VERTICAL){
//豎向listview列表
dragFlags
=
ItemTouchHelper.UP
|
ItemTouchHelper.DOWN;
//允許上下的拖動
swipeFlags
=
ItemTouchHelper.LEFT;
//只允許從右向左側(cè)滑刪除
}
}else{
//最后一個條目既不能拖拽也不能刪除
相當(dāng)于更多
dragFlags
=
0;
swipeFlags
=
0;
}
return
makeMovementFlags(dragFlags,swipeFlags);
}
@Override
public
boolean
onMove(RecyclerView
recyclerView,
RecyclerView.ViewHolder
viewHolder,
RecyclerView.ViewHolder
target)
{
mAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return
true;
}
@Override
public
void
onSwiped(RecyclerView.ViewHolder
viewHolder,
int
direction)
{
mAdapter.onItemDel(viewHolder.getAdapterPosition());
}
//
該方法返回true時,表示支持長按拖動
@Override
public
boolean
isLongPressDragEnabled()
{
return
isLongDrag;
}
//該方法返回true時,表示支持滑動刪除
@Override
public
boolean
isItemViewSwipeEnabled()
{
return
isMoveSwipe;
}
//從靜止?fàn)顟B(tài)變?yōu)橥献Щ蛘呋瑒拥臅r候會回調(diào)該方法,參數(shù)actionState表示當(dāng)前的狀態(tài)。
開始拖拽的時候給item添加一個背景
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2019-2025年軍隊文職人員招聘之軍隊文職教育學(xué)題庫與答案
- 2025年軍隊文職人員招聘之軍隊文職管理學(xué)與服務(wù)考試題庫
- 企業(yè)級數(shù)據(jù)安全合規(guī)策略制定服務(wù)協(xié)議
- 網(wǎng)絡(luò)直播平臺合作項目表
- 四川省成都市武侯區(qū)2024-2025學(xué)年七年級上學(xué)期期末生物學(xué)試題(含答案)
- 湖南省岳陽市岳陽縣2024-2025學(xué)年七年級上學(xué)期期末生物學(xué)試題(含答案)
- 語言學(xué)英語翻譯技能測試卷
- 濕地松采脂承包合同
- 團隊目標(biāo)與績效考核表
- 音樂劇的奇幻世界觀后感
- CB/T 495-1995吸入口
- 建筑工程施工安全技術(shù)與管理課件
- 二年級下冊數(shù)學(xué)下冊第一單元
- 本科教學(xué)工作合格評估基本知識課件
- 物業(yè)管理服務(wù)大型活動服務(wù)方案
- 外科護理病歷
- 跨境電商行業(yè)深度研究報告
- 《總體國家安全觀學(xué)習(xí)綱要》全書PPT
- 軟件項目進度計劃完整參考模板
- 特種設(shè)備使用單位名稱變更申請表(共2頁)
- CASS勘測定界操作指導(dǎo)方案
評論
0/150
提交評論