4

我正在尝试在android中构建一个应用程序,在我的一个活动中,我想显示全屏图像并通过在图片上滑动手指使它们左右滑动。

我已经尝试过基本的画廊视图和图像切换器,但我无法处理触摸事件以产生滑动效果,就像在自定义 android 画廊中一样,但没有缩略图。

这是我的简单图像切换器 xml 和活动类。如果有人向我展示一种方法或在下面编辑我的代码,我将不胜感激。提前致谢...

布局xml:

 <?xml version="1.0" encoding="utf-8"?>
    <ImageSwitcher 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/imageSwitcher"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:onClick="imageClick"
    android:src="@drawable/ic_launcher"
    android:keepScreenOn="true">
    </ImageSwitcher>

代码 :

public class GalleryActivity extends Activity implements ViewFactory {

    private ImageSwitcher imageSwitcher ;


    @Override  
    public void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState);  
         setContentView(R.layout.activities);  

         imageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher);
         imageSwitcher.setFactory(this);
         imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
         imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));

         imageSwitcher.setImageResource(R.drawable.menu);

         imageSwitcher.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                findViewById(R.drawable.menu);
                imageSwitcher.addView((ImageSwitcher) findViewById(R.drawable.etkinlik));
                imageSwitcher.showNext();

                return false;
            }
        });
    }  
        public View makeView() {  
        ImageView iView = new ImageView(this);
        iView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        iView.setLayoutParams(new
                    ImageSwitcher.LayoutParams(
                                LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
        iView.setBackgroundColor(0xFF000000);
        return iView;
    }
}  

在编辑了一些@imran khan 的解决方案后,这里的代码运行良好。

解决方案:

ImageSwitcher imageSwitcher ;

Integer[] imageList = {
        R.drawable.gallery,
        R.drawable.menu,
        R.drawable.promotion,
        R.drawable.info,
        R.drawable.activities       
};

int curIndex=0;
int downX,upX;

@Override  
public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activities);  

     imageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher);
     imageSwitcher.setFactory(this);
     imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in));
     imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out));

     imageSwitcher.setImageResource(imageList[curIndex]);
     imageSwitcher.setOnTouchListener(new OnTouchListener() {
     @Override
     public boolean onTouch(View v, MotionEvent event) {

         if (event.getAction() == MotionEvent.ACTION_DOWN) {
             downX = (int) event.getX(); 
             Log.i("event.getX()", " downX " + downX);
             return true;
         } 

         else if (event.getAction() == MotionEvent.ACTION_UP) {
             upX = (int) event.getX(); 
             Log.i("event.getX()", " upX " + downX);
             if (upX - downX > 100) {

                 //curIndex  current image index in array viewed by user
                 curIndex--;
                 if (curIndex < 0) {
                     curIndex = imageList.length-1;
                 }

                 imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(GalleryActivity.this,R.anim.slide_in_left));
                 imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(GalleryActivity.this,R.anim.slide_out_right));

                 imageSwitcher.setImageResource(imageList[curIndex]);
                 //GalleryActivity.this.setTitle(curIndex);
             } 

             else if (downX - upX > -100) {

                 curIndex++;
                 if (curIndex > 4) {
                     curIndex = 0;
                 }

                 imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(GalleryActivity.this,R.anim.slide_in_right));
                 imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(GalleryActivity.this,R.anim.slide_out_left));

                 imageSwitcher.setImageResource(imageList[curIndex]);
                 //GalleryActivity.this.setTitle(curIndex);
             }
                 return true;
             }
             return false;
         }
     });
}
@Override
public View makeView() {
    ImageView i = new ImageView(this);  
    i.setScaleType(ImageView.ScaleType.FIT_CENTER);
    return i;
}
4

2 回答 2

2

试试这种方式:

imageSwitcher1 = (ImageSwitcher) findViewById(R.id.imageSwitcher1);
imageSwitcher1.setFactory(this);
imageSwitcher1.setInAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_in));
imageSwitcher1.setOutAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_out));
imageSwitcher1.setImageResource(R.drawable.girl2);
imageSwitcher1.setOnTouchListener(new OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
            if (event.getAction() == MotionEvent.ACTION_DOWN) { 
                downX = (int) event.getX();
                return true; 
            } else if (event.getAction() == MotionEvent.ACTION_UP) { 
                upX = (int) event.getX();
                if (upX - downX > 100) {
                imageSwitcher1.setInAnimation(AnimationUtils.loadAnimation(ShowPhotoActivity.this,
                android.R.anim.slide_in_left));
                mageSwitcher1.setOutAnimation(AnimationUtils.loadAnimation(ShowPhotoActivity.this,
                android.R.anim.slide_out_right));
                imageSwitcher1.setImageResource(R.drawable.girl1);
                } else if (downX - upX > 100)//                { 
                imageSwitcher1.setInAnimation(AnimationUtils.loadAnimation(ShowPhotoActivity.this,
                android.R.anim.slide_in_left));
                imageSwitcher1.setOutAnimation(AnimationUtils.loadAnimation(ShowPhotoActivity.this,
                android.R.anim.slide_out_right));
                imageSwitcher1.setImageResource(R.drawable.girl2);
                } 
                return true; 
            } 
            return false; 
        } 
    };

如果你有图像数组,那么试试这个:

imgSwitcher.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    downX = (int) event.getX(); 
                    Log.i("event.getX()", " downX " + downX);
                    return true;
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    upX = (int) event.getX(); 
                    Log.i("event.getX()", " upX " + downX);
                    if (upX - downX > 100) {
                        imgSwitcher.setInAnimation(AnimationUtils
                        .loadAnimation(firstActivity.this,
                         android.R.anim.slide_in_left));
                        imgSwitcher.setOutAnimation(AnimationUtils
                         .loadAnimation(firstActivity.this,
                         android.R.anim.slide_out_right));
                         //curIndex  current image index in array viewed by user
                        curIndex--;
                        if (curIndex < 0) {
                            curIndex = 5;
                        }
                        //IMAGE_LIST :-image list array
                        imgSwitcher.setImageResource(IMAGE_LIST[curIndex]);
                        firstActivity.this.switchTitle(curIndex);
                    } else if (downX - upX > 100) { 
                        imgSwitcher.setInAnimation(AnimationUtils
                        .loadAnimation(firstActivity.this,
                        R.anim.slide_out_left));
                        imgSwitcher.setOutAnimation(AnimationUtils
                        .loadAnimation(firstActivity.this,
                        R.anim.slide_in_right));
                        curIndex++;
                        if (curIndex > 5) {
                            curIndex = 0;
                        }
                        imgSwitcher.setImageResource(IMAGE_LIST[curIndex]);
                        firstActivity.this.switchTitle(curIndex);
                    }
                    return true;
                }
                return false;
            }
        });
于 2012-04-06T23:31:31.630 回答
1

我建议使用兼容性库,然后使用view pager。这样,Android 将为您完成所有繁重的工作,您所要做的就是告诉 ViewPager 您有多少张图片以及它们是什么。

这是一个来自谷歌的例子,我为你做了一些改动。

public class FragmentPagerSupport extends FragmentActivity {
static final int NUM_ITEMS = 10;

MyAdapter mAdapter;

ViewPager mPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_pager);

    mAdapter = new MyAdapter(getSupportFragmentManager());

    mPager = (ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

    // Watch for button clicks.
    Button button = (Button)findViewById(R.id.goto_first);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            mPager.setCurrentItem(0);
        }
    });
    button = (Button)findViewById(R.id.goto_last);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            mPager.setCurrentItem(NUM_ITEMS-1);
        }
    });
}

public static class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {
        return ArrayListFragment.newInstance(position);
    }
}

public static class ArrayListFragment extends ListFragment {
    int mNum;

    /**
     * Create a new instance of CountingFragment, providing "num"
     * as an argument.
     */
    static ArrayListFragment newInstance(int num) {
        ArrayListFragment f = new ArrayListFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    /**
     * When creating, retrieve this instance's number from its arguments.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
    }

    /**

     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
        View tv = v.findViewById(R.id.text);
        ((ImageView)tv).setImageDrawable(#INSERT YOUR IMAGEHERE) //you can pass the id of the drawable into the mNum. Or you could make it a String instead of int and pass the url.
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, Cheeses.sCheeseStrings));
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Log.i("FragmentList", "Item clicked: " + id);
    }
}
}

编辑:对不起,格式有点不对...

于 2012-04-06T12:55:26.093 回答