2015-04-03 5 views
18

Я хотел бы создать приложение с горизонтальной галереей изображений (с одной строкой и несколькими столбцами). Сначала я пытаюсь использовать gridview, но его можно использовать только как вертикальную прокрутку. Могу ли я использовать ListView или GridView для этих целей?Android Галерея изображений с горизонтальной прокруткой

Image gallery with horizontal scrolling

+0

Возможный дубликат [HorizontalScrollView внутри scrollView android] (http://stackoverflow.com/questions/42230711/horizontalscrollview-inside-a-scrollview-android) – Shawn

ответ

0

HorizontalScrollView Documentation

Для использования HorizontalScrollView вы должны иметь только одного ребенка внутри него. То, как я использовал его раньше, с изображениями, такими как то, что вы делаете, - это создать TableLayout и добавить изображения в TableRows. TableLayout может иметь много строк или всего одну строку и много столбцов.

Вы можете добавить ImageViews (или любой другой вид) в каждую строку, а затем, наконец, добавить TableRow в TableLayout. После того, как TableLayout сделано, все, что вам нужно сделать, это:

//createTable method is where you would loop through the images to add 
    TableLayout table = createTable(rowCount, columnCount); 
    HorizontalScrollView hozView = new HorizontalScrollView(this); 
    hozView.addView(table); 
    setContentView(hozView); 
22

создать LinearLayout внутри HorizontalScrollView, а затем создать ImageView динамически и добавить, что ImageView в LinearLayout.

Пример кода:

<HorizontalScrollView 
android:id="@+id/horizontal_scroll" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" > 

    <LinearLayout 
    android:id="@+id/linear" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
    </LinearLayout> 

</HorizontalScrollView> 

В OnCreate() метод, получить идентификатор LinearLayout из файла XML и добавить динамически создаваемых ImageView в LinearLayout:

LinearLayout layout = (LinearLayout) findViewById(R.id.linear); 
    for (int i = 0; i < 10; i++) { 
     ImageView imageView = new ImageView(this); 
     imageView.setId(i); 
     imageView.setPadding(2, 2, 2, 2); 
     imageView.setImageBitmap(BitmapFactory.decodeResource(
       getResources(), R.drawable.ic_launcher)); 
     imageView.setScaleType(ScaleType.FIT_XY); 
     layout.addView(imageView); 
    } 
+0

У меня разные картинки с различными пропорциями. Я хочу, чтобы все они заполняли высоту линейного прохода, который, в свою очередь, заполнял Enity HorizontalScrollView. Как мне подойти к этим решениям? – KasparTr

+2

Это замечательно. Как вы ленитесь с помощью этого метода? – justdan0227

+0

Работая спасибо, но я хочу загрузить различное изображение из arraylist.How, чтобы достичь этого. – Punithapriya

1

Поскольку мы no longer have в Gallery виджет требуется немного DIY-мышки. Вы можете создать горизонтально прокрутки полосы миниатюр с HorizontalScrollView и вложенной LinearLayout и динамически добавлять изображения к нему из вашей деятельности:

<HorizontalScrollView 
    android:layout_width="match_parent" 
    android:layout_height="72dp" 
    android:layout_gravity="bottom" 
    android:background="@color/black"> 
    <LinearLayout 
     android:id="@+id/thumbnails" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:gravity="center_vertical" 
     android:orientation="horizontal" 
     android:paddingTop="2dp"/> 
</HorizontalScrollView> 

ниже код взят из этого урока: http://sourcey.com/android-horizontally-scrolling-pan-scan-and-zoom-image-gallery/ GalleryActivity реализует то, что вы «ищет, а также расширяет свой запрос, добавив ViewPager элемент для отображения выбранного изображения и SubsamplingScaleImageView, так что вы можете панорамировать, сканировать и увеличить выбранное изображение:

package com.sourcey.imagegallerydemo; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.support.v4.view.PagerAdapter; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.FrameLayout; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 

import com.bumptech.glide.Glide; 
import com.bumptech.glide.request.animation.GlideAnimation; 
import com.bumptech.glide.request.target.SimpleTarget; 
import com.davemorrissey.labs.subscaleview.ImageSource; 
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; 

import junit.framework.Assert; 

import java.util.ArrayList; 

import butterknife.ButterKnife; 
import butterknife.InjectView; 

public class GalleryActivity extends AppCompatActivity { 
    public static final String TAG = "GalleryActivity"; 
    public static final String EXTRA_NAME = "images"; 

    private ArrayList<String> _images; 
    private GalleryPagerAdapter _adapter; 

    @InjectView(R.id.pager) ViewPager _pager; 
    @InjectView(R.id.thumbnails) LinearLayout _thumbnails; 
    @InjectView(R.id.btn_close) ImageButton _closeButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_gallery); 
     ButterKnife.inject(this); 

     _images = (ArrayList<String>) getIntent().getSerializableExtra(EXTRA_NAME); 
     Assert.assertNotNull(_images); 

     _adapter = new GalleryPagerAdapter(this); 
     _pager.setAdapter(_adapter); 
     _pager.setOffscreenPageLimit(6); // how many images to load into memory 

     _closeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "Close clicked"); 
       finish(); 
      } 
     }); 
    } 

    class GalleryPagerAdapter extends PagerAdapter { 

     Context _context; 
     LayoutInflater _inflater; 

     public GalleryPagerAdapter(Context context) { 
      _context = context; 
      _inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public int getCount() { 
      return _images.size(); 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object object) { 
      return view == ((LinearLayout) object); 
     } 

     @Override 
     public Object instantiateItem(ViewGroup container, final int position) { 
      View itemView = _inflater.inflate(R.layout.pager_gallery_item, container, false); 
      container.addView(itemView); 

      // Get the border size to show around each image 
      int borderSize = _thumbnails.getPaddingTop(); 

      // Get the size of the actual thumbnail image 
      int thumbnailSize = ((FrameLayout.LayoutParams) 
        _pager.getLayoutParams()).bottomMargin - (borderSize*2); 

      // Set the thumbnail layout parameters. Adjust as required 
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(thumbnailSize, thumbnailSize); 
      params.setMargins(0, 0, borderSize, 0); 

      // You could also set like so to remove borders 
      //ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
      //  ViewGroup.LayoutParams.WRAP_CONTENT, 
      //  ViewGroup.LayoutParams.WRAP_CONTENT); 

      final ImageView thumbView = new ImageView(_context); 
      thumbView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      thumbView.setLayoutParams(params); 
      thumbView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.d(TAG, "Thumbnail clicked"); 

        // Set the pager position when thumbnail clicked 
        _pager.setCurrentItem(position); 
       } 
      }); 
      _thumbnails.addView(thumbView); 

      final SubsamplingScaleImageView imageView = 
        (SubsamplingScaleImageView) itemView.findViewById(R.id.image); 

      // Asynchronously load the image and set the thumbnail and pager view 
      Glide.with(_context) 
        .load(_images.get(position)) 
        .asBitmap() 
        .into(new SimpleTarget<Bitmap>() { 
         @Override 
         public void onResourceReady(Bitmap bitmap, GlideAnimation anim) { 
          imageView.setImage(ImageSource.bitmap(bitmap)); 
          thumbView.setImageBitmap(bitmap); 
         } 
        }); 

      return itemView; 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      container.removeView((LinearLayout) object); 
     } 
    } 
} 

Полный проект Android работает на Github: https://github.com/sourcey/imagegallerydemo

Пожалуйста, выберите ответ, если у вас есть то, что вы ищете ...

+0

Почему вы используете InjectView вместо классического findViewById? Это лучше? Спасибо. – researcher

+1

Сеть обязательно лучше, но Java - очень подробный язык, и это помогает создавать более чистый код. – Kamo

-1

[введите описание изображения здесь] [1]

[1]: http://i.stack.imgur.com/OCgSk.pngсильный текст

Вы можете использовать Recycler View для создания слайд вид изображения

layoutManager=new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.HORIZONTAL, false); 
        Hor_RecylerView.setLayoutManager(layoutManager); 
        AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(i); 
        Hor_RecylerView.getItemAnimator().setAddDuration(1000); 
        Hor_RecylerView.setAdapter(new SlideInLeftAnimationAdapter(alphaAdapter)); 
2

См работу demo from here

С выпуском библиотеки RecyclerView вы можете легко реализовать как горизонтальной и вертикальной ориентации списка. Это стало возможным благодаря использованию LinearLayoutManager, для которого можно задать ориентацию либо по горизонтали или по вертикали, как показано ниже ...

LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false); 

enter image description here

Вы можете read more

Смежные вопросы