版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)微信朋友圈拍照上傳功能
Android中怎么實(shí)現(xiàn)微信朋友圈拍照上傳功能,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。1.PhotoPicker的使用這是一個(gè)支持選擇多張圖片,點(diǎn)擊圖片放大,圖片之間左右滑動(dòng)互相切換的庫,同時(shí)支持圖片刪除的庫,效果類似微信。(1)添加PhotoPicker的架包(2)使用
選擇圖片:安卓6.0以后需要在代碼中添加讀寫sd卡和相機(jī)的權(quán)限當(dāng)然清單文件中也需要添加的
PhotoPicker.builder()
.setPhotoCount(maxPhoto)
//設(shè)置最多選擇的圖片數(shù)量
.setShowCamera(true)
//是否顯示相機(jī)按鈕
.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);
//實(shí)現(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("手機(jī)照片",
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);
}
//滑動(dòng)刪除相關(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實(shí)現(xiàn)
MyItemTouchHelperCallback
callBack
=
new
MyItemTouchHelperCallback(mPhotoAdapter);
//實(shí)現(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){
//
如果是最后一個(gè)條目
則既不能拖拽也不能刪除
dragFlags
=
0;
swipeFlags
=
0;
}
else
if(layoutManager
instanceof
GridLayoutManager
||
layoutManager
instanceof
StaggeredGridLayoutManager){//網(wǎng)格布局
則支持上下左右拖拽
不支持刪除
dragFlags
=
ItemTouchHelper.UP
|
ItemTouchHelper.DOWN
|
ItemTouchHelper.LEFT
|
ItemTouchHelper.RIGHT;
//允許上下左右的拖動(dòng)
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;
//允許左右的拖動(dòng)
swipeFlags
=
ItemTouchHelper.DOWN;
//只允許從上向下側(cè)滑
}else
if(orientation
==
LinearLayoutManager.VERTICAL){
//豎向listview列表
dragFlags
=
ItemTouchHelper.UP
|
ItemTouchHelper.DOWN;
//允許上下的拖動(dòng)
swipeFlags
=
ItemTouchHelper.LEFT;
//只允許從右向左側(cè)滑刪除
}
}else{
//最后一個(gè)條目既不能拖拽也不能刪除
相當(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時(shí),表示支持長按拖動(dòng)
@Override
public
boolean
isLongPressDragEnabled()
{
return
isLongDrag;
}
//該方法返回true時(shí),表示支持滑動(dòng)刪除
@Override
public
boolean
isItemViewSwipeEnabled()
{
return
isMoveSwipe;
}
//從靜止?fàn)顟B(tài)變?yōu)橥献Щ蛘呋瑒?dòng)的時(shí)候會回調(diào)該方法,參數(shù)actionState表示當(dāng)前的狀態(tài)。
開始拖拽的時(shí)候給item添加一個(gè)背景
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國建筑錨固行業(yè)深度分析及抗震性能與檢測認(rèn)證標(biāo)準(zhǔn)研究
- 中國建筑玻璃行業(yè)職業(yè)技能培訓(xùn)體系完善建議報(bào)告
- 中國建筑涂料包裝市場現(xiàn)狀分析及可持續(xù)包裝趨勢與成本優(yōu)化策略
- 中國建筑機(jī)械安全生產(chǎn)管理與事故預(yù)防策略報(bào)告
- 中國建筑工程機(jī)械行業(yè)技術(shù)標(biāo)準(zhǔn)體系與認(rèn)證要求分析報(bào)告
- 中國建筑工程機(jī)械行業(yè)市場滲透率與增長空間評估報(bào)告
- 2026年特種設(shè)備安全管理與操作規(guī)范題庫
- 雨水管理信息系統(tǒng)建設(shè)方案
- 道路交通事故風(fēng)險(xiǎn)評估方案
- 新型道路材料應(yīng)用研究方案
- 公路成本管理培訓(xùn)
- 2026云南昆明市公共交通有限責(zé)任公司總部職能部門員工遴選48人筆試模擬試題及答案解析
- 2025至2030中國數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)發(fā)展現(xiàn)狀及未來趨勢分析報(bào)告
- 上海市松江區(qū)2025-2026學(xué)年八年級(上)期末化學(xué)試卷(含答案)
- 導(dǎo)管室護(hù)理新技術(shù)
- 中國信通服務(wù):2025算力運(yùn)維體系技術(shù)白皮書
- GJB3243A-2021電子元器件表面安裝要求
- 學(xué)堂在線 雨課堂 學(xué)堂云 工程倫理 章節(jié)測試答案
- 圓柱彈簧通用作業(yè)指導(dǎo)書
- 熱力學(xué)統(tǒng)計(jì)物理第三章
- 家庭裝修簡易合同范本模板六篇
評論
0/150
提交評論