Android 응용 프로그램 개발 AndroidStagerEdGrid 라이브러리, StoggerEdGrid보기 형식의 이미지를 볼 수 없습니다.
-
02-01-2020 - |
문제
Android 응용 프로그램을 개발하고 있습니다. 여기서 모든 갤러리 이미지를 조각에 표시하는 것으로 생각합니다. 나는 그 모든 갤러리 이미지와 함께 일하는 조각을 미리보기 이미지로 가지고 있습니다. 그런 다음 모자이크 형식으로 모든 이미지를 보여주고 싶지만 그 것에 관해서는 아무 것도 찾을 수 없었습니다. 그래서 나는 AndroidStagerEdGrid 라이브러리를 사용하여 Etsy 스타일의 이미지를 보여주기로 결정했습니다. 라이브러리를 성공적으로 가져 왔으며 AndroidStagerEdGrid의 GitHub 페이지에 따라 코드를 변경했습니다. 그러나 이미지는 여전히 정상 갤러리 및 열과 동일한 형식으로 나타납니다. 누군가가 그것을 도와 줄 수 있습니까? 아래는 코드가 있습니다.
Aptaptor- 이것은 My ImageView 용 어댑터입니다. 여기에서는 작동하는지 테스트하기 위해 배경색을 추가했습니다. 그러나 그것의가 아닙니다.
package com.ultimate.camera.adapters;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import com.etsy.android.grid.util.DynamicHeightImageView;
import com.ultimate.camera.R;
import com.ultimate.camera.adapters.items.PhotoItem;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class PhotoAdapter extends ArrayAdapter<PhotoItem>{
private static final String TAG = "PhotoAdaptor";
private Context context;
private int resourceId;
private final Random mRandom;
private final ArrayList<Integer> mBackgroundColors;
private static final SparseArray<Double> sPositionHeightRatios = new SparseArray<Double>();
public PhotoAdapter(Context context, int resourceId,
List<PhotoItem> items, boolean useList) {
super(context, resourceId, items);
mRandom = new Random();
this.context = context;
this.resourceId = resourceId;
mBackgroundColors = new ArrayList<Integer>();
mBackgroundColors.add(R.color.orange);
mBackgroundColors.add(R.color.green);
mBackgroundColors.add(R.color.blue);
mBackgroundColors.add(R.color.yellow);
mBackgroundColors.add(R.color.grey);
}
private class ViewHolder {
DynamicHeightImageView photoImageView;
}
/**
* Populate the view holder with data.
* @param position
* @param convertView
* @param parent
* @return
*/
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
PhotoItem photoItem = getItem(position);
View viewToUse = null;
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
holder = new ViewHolder();
viewToUse = mInflater.inflate(resourceId, null);
holder.photoImageView = (DynamicHeightImageView) viewToUse.findViewById(R.id.imageView);
viewToUse.setTag(holder);
} else {
viewToUse = convertView;
holder = (ViewHolder) viewToUse.getTag();
}
double positionHeight = getPositionRatio(position);
int backgroundIndex = position >= mBackgroundColors.size() ?
position % mBackgroundColors.size() : position;
Log.d(TAG, "getView position:" + position + " h:" + positionHeight);
// Set the thumbnail
holder.photoImageView.setImageURI(photoItem.getThumbnailUri());
holder.photoImageView.setHeightRatio(positionHeight);
viewToUse.setBackgroundResource(mBackgroundColors.get(backgroundIndex));
return viewToUse;
}
private double getPositionRatio(final int position) {
double ratio = sPositionHeightRatios.get(position, 0.0);
if (ratio == 0) {
ratio = getRandomHeightRatio();
sPositionHeightRatios.append(position, ratio);
Log.d(TAG, "getPositionRatio:" + position + " ratio:" + ratio);
}
return ratio;
}
private double getRandomHeightRatio() {
return (mRandom.nextDouble() / 2.0) + 1.0; // height will be 1.0 - 1.5 the width
}
}
.
PhotoITem Java이 인터페이스는 어댑터에 대한 광격을 얻는 것입니다
package com.ultimate.camera.adapters.items;
import android.net.Uri;
public class PhotoItem {
private Uri thumbnailUri;
private Uri fullImageUri;
public PhotoItem(Uri thumbnailUri,Uri fullImageUri) {
this.thumbnailUri = thumbnailUri;
this.fullImageUri = fullImageUri;
}
/**
* Getters and setters
*/
public Uri getThumbnailUri() {
return thumbnailUri;
}
public void setThumbnailUri(Uri thumbnailUri) {
this.thumbnailUri = thumbnailUri;
}
public Uri getFullImageUri() {
return fullImageUri;
}
public void setFullImageUri(Uri fullImageUri) {
this.fullImageUri = fullImageUri;
}
}
.
PhotogalleryFragment Photo Gallery 용 XML 레이어
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--<FrameLayout-->
<!--android:layout_width="fill_parent"-->
<!--android:layout_height="fill_parent">-->
<!--<GridView-->
<!--style="@style/GridView.PhotoGallery"-->
<!--android:id="@android:id/list"-->
<!--android:numColumns="3" />-->
<com.etsy.android.grid.StaggeredGridView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
app:item_margin="8dp"
app:column_count="2"
></com.etsy.android.grid.StaggeredGridView>
<TextView
android:id="@+id/empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:visibility="invisible"/>
<!--</FrameLayout>-->
</LinearLayout>
.
사진 항목 XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout
android:layout_width="@dimen/photo_width"
android:layout_height="@dimen/photo_height">
<com.etsy.android.grid.util.DynamicHeightImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/imageView"
android:adjustViewBounds="false"
android:gravity="center"
android:scaleType="centerCrop"/>
</FrameLayout>
</RelativeLayout>
.
photogalleryfragment.java
package com.ultimate.camera.fragments;
import android.app.Activity;
import android.app.LoaderManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Loader;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.TextView;
import com.etsy.android.grid.StaggeredGridView;
import com.ultimate.camera.R;
import com.ultimate.camera.activities.MainActivity;
import com.ultimate.camera.adapters.PhotoAdapter;
import com.ultimate.camera.adapters.items.PhotoItem;
import com.ultimate.camera.utilities.PhotoGalleryAsyncLoader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class SimplePhotoGalleryListFragment extends BaseFragment implements AbsListView.OnItemClickListener,
LoaderManager.LoaderCallbacks<List<PhotoItem>> {
protected OnFragmentInteractionListener mListener;
// protected AbsListView mListView;
protected PhotoAdapter mAdapter;
protected ArrayList<PhotoItem> mPhotoListItem;
protected TextView mEmptyTextView;
protected ProgressDialog mLoadingProgressDialog;
protected StaggeredGridView mListView;
/**
* Required empty constructor
*/
public SimplePhotoGalleryListFragment() {
super();
}
/**
* Static factory method
* @param sectionNumber
* @return
*/
public static SimplePhotoGalleryListFragment newInstance(int sectionNumber) {
SimplePhotoGalleryListFragment fragment = new SimplePhotoGalleryListFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create an empty loader and pre-initialize the photo list items as an empty list.
Context context = getActivity().getBaseContext();
// Set up empty mAdapter
mPhotoListItem = new ArrayList<PhotoItem>() ;
mAdapter = new PhotoAdapter(context,
R.layout.photo_item,
mPhotoListItem, false);
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
getLoaderManager().initLoader(0, null, this);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = null;
view = inflater.inflate(R.layout.fragment_photo_gallery, container, false);
// Set the mAdapter
mListView = (StaggeredGridView) view.findViewById(android.R.id.list);
((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter);
mEmptyTextView = (TextView)view.findViewById(R.id.empty);
// Show the empty text / message.
resolveEmptyText();
// Set OnItemClickListener so we can be notified on item clicks
mListView.setOnItemClickListener(this);
return view;
}
protected void resolveEmptyText(){
if(mAdapter.isEmpty()){
mEmptyTextView.setVisibility(View.VISIBLE);
setEmptyText();
} else {
mEmptyTextView.setVisibility(View.INVISIBLE);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
// Show a progress dialog.
mLoadingProgressDialog = new ProgressDialog(getActivity());
mLoadingProgressDialog.setMessage("Loading Photos...");
mLoadingProgressDialog.setCancelable(true);
mLoadingProgressDialog.show();
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
cancelProgressDialog();
}
@Override
public void onPause(){
super.onPause();
cancelProgressDialog();
}
@Override
public void onStop(){
super.onStop();
cancelProgressDialog();
}
/**
* This is only triggered when the user selects a single photo.
* @param parent
* @param view
* @param position
* @param id
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (null != mListener) {
// Tell the share builder to add the photo to the share operation.
PhotoItem photoListItem = (PhotoItem)this.mAdapter.getItem(position);
String imagePath = photoListItem.getThumbnailUri().getPath();
mListener.onFragmentInteraction(MainActivity.SELECT_PHOTO_ACTION);
resetFragmentState();
}
}
/**
* Used when hitting the back button to reset the mFragment UI state
*/
protected void resetFragmentState(){
// Clear view state
getActivity().invalidateOptionsMenu();
((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();
}
public void setEmptyText() {
mEmptyTextView.setText("No Photos!");
}
/**
* Loader Handlers for loading the photos in the background.
*/
@Override
public Loader<List<PhotoItem>> onCreateLoader(int id, Bundle args) {
// This is called when a new Loader needs to be created. This
// sample only has one Loader with no arguments, so it is simple.
return new PhotoGalleryAsyncLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<List<PhotoItem>> loader, List<PhotoItem> data) {
// Set the new data in the mAdapter.
mPhotoListItem.clear();
for(int i = 0; i < data.size();i++){
PhotoItem item = data.get(i);
mPhotoListItem.add(item);
}
mAdapter.notifyDataSetChanged();
resolveEmptyText();
cancelProgressDialog();
}
@Override
public void onLoaderReset(Loader<List<PhotoItem>> loader) {
// Clear the data in the mAdapter.
mPhotoListItem.clear();
mAdapter.notifyDataSetChanged();
resolveEmptyText();
cancelProgressDialog();
}
/**
* Save cancel for the progress loader
*/
private void cancelProgressDialog(){
if(mLoadingProgressDialog != null){
if(mLoadingProgressDialog.isShowing()){
mLoadingProgressDialog.cancel();
}
}
}
}
.
내 출력
내 출력 이미지에서 볼 수있는 크기의 축소판 그림을 볼 수 있습니다. 텍스트가 없습니다. 그러나 모든 이미지가 다른 크기의 축소판을 기대합니다.
누군가가 이것을 도와 주면 실제로 appriciat를 할 것입니다. 또한 누구든지 누군가가 모자이크 포르네이트 이미지를 제공 한 이미지의 모자이크 형성을 만드는 방법을 알고 있다면
해결책
몇 시간 동안 내 머리를 다시 긁으면 마침내 나는 대답을 알아 냈습니다. 문제는 PhotoItem 레이아웃 파일 (PhotoITem.xml)에있었습니다 (photoitem.xml). 여기서 각 PhotoItem에 대한 레이아웃이 조각에 표시 될 것입니다. DynamicImageView 섹션의 부모로서 FrameLayout이 있으며, 이는 자체 너비와 높이가 있으며, 이로 인해 동적 Hight Highter.PhotoImageView.SetHeightration (PositionHeight)을 PhotoITEM에 설정할 수 없습니다. 그래서, 유일한 변화는 picatom.xml이었습니다. 코드의 휴식을 유지해야합니다.
FrameLayout 섹션을 제거하고 DynamicImageView 만 PhotoItem 레이아웃으로 유지해야했습니다.
phototem.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.etsy.android.grid.util.DynamicHeightImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/imageView"
android:adjustViewBounds="false"
android:gravity="center"
android:scaleType="centerCrop"/>
</RelativeLayout>
.
그런 다음 괜찮아 왔고 이제는 이렇게했습니다. 아래에 스크린 샷을 첨부했습니다.
나는 여전히 모자이크 뷰 솔루션을 찾고 있습니다
감사합니다
다른 팁
홀더가 홀더로 인해 동일한 크기의 모든 이미지가 있습니다.당신은 당신의 이미지에 대해 heightratio를 앉히고이 줄을 제거하고 모든 효과를 제거하십시오 .. holder.photoImageView.SetheightRatio (PositionHeight)를 제거하십시오.