安卓代码中,我有五张图片,设置一个button,如何点击一次button就切换下一张图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓代码中,我有五张图片,设置一个button,如何点击一次button就切换下一张图片相关的知识,希望对你有一定的参考价值。

参考技术A 第一种:使用动画的方法实现:(代码繁琐)
这种发放需要:两个动画效果,一个布局,一个主类来实现,不多说了,来看代码吧:
public class IamgeTrActivity extends Activity
/** Called when the activity is first created. */

public ImageView imageView;
public ImageView imageView2;

public Animation animation1;
public Animation animation2;

public TextView text;

public boolean juage = true;

public int images[] = new int[] R.drawable.icon, R.drawable.expriment,
R.drawable.changer, R.drawable.dataline, R.drawable.preffitication ;

public int count = 0;

public Handler handler = new Handler();

public Runnable runnable = new Runnable()

@Override
public void run()
// TODO Auto-generated method stub
AnimationSet animationSet1 = new AnimationSet(true);
AnimationSet animationSet2 = new AnimationSet(true);
imageView2.setVisibility(0);
TranslateAnimation ta = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
-1f, Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0f);
ta.setDuration(2000);
animationSet1.addAnimation(ta);
animationSet1.setFillAfter(true);
ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 1.0f,
Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
0f, Animation.RELATIVE_TO_SELF, 0f);
ta.setDuration(2000);
animationSet2.addAnimation(ta);
animationSet2.setFillAfter(true);
//iamgeView 出去 imageView2 进来
imageView.startAnimation(animationSet1);
imageView2.startAnimation(animationSet2);
imageView.setBackgroundResource(images[count % 5]);
count++;
imageView2.setBackgroundResource(images[count % 5]);

text.setText(String.valueOf(count));
if (juage)
handler.postDelayed(runnable, 6000);
Log.i(handler, handler);

;

@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.imageView);
imageView2 = (ImageView) findViewById(R.id.imageView2);
text=(TextView)findViewById(R.id.text);
text.setText(String.valueOf(count));
//将iamgeView先隐藏,然后显示
imageView2.setVisibility(4);
handler.postDelayed(runnable, 2000);


public void onPause()
juage = false;
super.onPause();



布局代码:

android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
android:id=@+id/rl>

android:id=@+id/imageView
android:layout_width=fill_parent
android:background=@drawable/icon
android:layout_below=@+id/rl
android:layout_height=120dp />

android:id=@+id/imageView2
android:layout_width=fill_parent
android:background=@drawable/expriment
android:layout_below=@+id/rl
android:layout_height=120dp />

android:id=@+id/text
android:layout_width=fill_parent
android:layout_height=wrap_content
android:layout_below=@id/imageView/>

第二种:使用ViewFlipper实现图片的轮播

Android系统自带的一个多页面管理控件,它可以实现子界面的自动切换:
首先 需要为ViewFlipper加入View
(1) 静态导入:在layout布局文件中直接导入
(2) 动态导入:addView()方法
ViewPlipper常用方法:
setInAnimation:设置View进入屏幕时候使用的动画
setOutAnimation:设置View退出屏幕时候使用的动画
showNext:调用该函数来显示ViewFlipper里面的下一个View
showPrevious:调用该函数来显示ViewFlipper里面的上一个View
setFlipInterval:设置View之间切换的时间间隔
startFlipping使用上面设置的时间间隔来开始切换所有的View,切换会循环进行
stopFlipping:停止View切换
讲了这么多,那么我们今天要实现的是什么呢?
(1) 利用ViewFlipper实现图片的轮播
(2) 支持手势滑动的ViewFlipper
我们需要先准备几张图片:把图片放进drawable中
创建两个动画:在res下面新建一个folder里面新建两个xml:
left_in:

android:duration=5000
android:fromXDelta=100%p
android:toXDelta=0/>

left_out:

android:fromXDelta=0
android:toXDelta=-100%p
android:duration=5000/>

一个布局文件:
xmlns:tools=http://schemas.android.com/tools
android:layout_width=match_parent
android:layout_height=match_parent
tools:context=.MainActivity >

android:id=@+id/flipper
android:layout_width=fill_parent
android:layout_height=fill_parent/>

一个主类:
public class MainActivity extends Activity

private ViewFlipper flipper;
private int[] resId = R.drawable.pc1,R.drawable.pc2,R.drawable.pc3,R.drawable.pc4;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

flipper = (ViewFlipper) findViewById(R.id.flipper);

/*
* 动态导入的方式为ViewFlipper加入子View
* */
for (int i = 0; i < resId.length; i++)
flipper.addView(getImageView(resId[i]));


/*
* 为ViewFlipper去添加动画效果
* */
flipper.setInAnimation(this, R.anim.left_in);
flipper.setOutAnimation(this, R.anim.left_out);
flipper.setFlipInterval(5000);
flipper.startFlipping();

private ImageView getImageView(int resId)
ImageView image = new ImageView(this);
image.setBackgroundResource(resId);
return image;



那么这样就实现了一个图片轮询的功能效果了
我们还可以添加点击,滑动效果:
我们还需要添加两个向右的滑动效果:
right_in:

android:fromXDelta=0
android:toXDelta=-100%p
android:duration=2000/>

right_out:

android:fromXDelta=100%p
android:toXDelta=0
android:duration=2000/>

然后我们还需要在主类里面添加(如果你不想让图片自动播放,只想通过手势来实现图片播放那么你需要把“为ViewFlipper添加动画效果的代码”删掉):
public boolean onTouchEvent(MotionEvent event)
// TODO Auto-generated method stub
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
startX = event.getX();
break;
case MotionEvent.ACTION_MOVE://判断向左滑动还是向右滑动
if (event.getX() - startX > 100)
flipper.setInAnimation(this, R.anim.left_in);
flipper.setOutAnimation(this, R.anim.left_out);
flipper.showPrevious();
else if (startX - event.getX() > 100)
flipper.setInAnimation(this, R.anim.right_in);
flipper.setOutAnimation(this, R.anim.right_out);
flipper.showNext();


case MotionEvent.ACTION_UP:
break;


return super.onTouchEvent(event);

这样我们利用我们的ViewFlipper完成的图片轮询的功能就做完了。
午夜神器APP私密即时语音互动聊天,匿名两性情趣秘密分享本回答被提问者和网友采纳

Android App内存优化之图片优化

不要将Button的背景设置为selector

??在布局文件和代码中,都可以为Button设置background为selector,这样方便实现按钮的正反选效果,但实际跟踪发现,如果是将Button的背景设置为selector,在初始化Button的时候会将正反选图片都加载在内存中(具体可以查看Android源码,在类Drawable.javacreateFromXmlInner方法中对图片进行解析,最终调用Drawableinflate方法),相当于一个按钮占用了两张相同大小图片所使用的内存,如果一个界面上按钮很多或者是按钮很大,光是按钮占用的内存就会很大,可以通过在布局文件中给按钮只设置正常状态下的背景图片,然后在代码中监听按钮的点击状态,当按下按钮时为按钮设置反选效果的图片,抬起时重新设置为正常状态下的背景。

如果你觉得为一个按钮提供正反选两张图片会导致APK的体积变大,可以通过如下方式实现按钮点击的反选效果,这种方式既不会存在Button占用两倍内存的情况,又减小了APK的体积(Android 5.0中的tintColor也可以实现类似的效果):

ImageButton personalInfoBtn = (ImageButton)findViewById(R.id.personalBtnId);
personalInfoBtn.setOnTouchListener(new OnTouchListener() {
  @SuppressLint("ClickableViewAccessibility")
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    if(action == MotionEvent.ACTION_DOWN){
      ((ImageButton)v).setColorFilter(getResources().getColor(0X50000000));
    }else if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL){
      ((ImageButton)v).clearColorFilter();
    }
    // 为了不影响监听按钮的onClick回调,返回值应为false
    return false;
  }
});

其它优化方式

1、尽量将Activity中的小图片和背景合并,一张小图片既浪费布局的时间,又平白地增加了内存占用;

2、不要在Activity的主题中为Activity设置默认的背景图片,这样会导致Activity占用的内存翻倍:

<!--千万不要在主题中为Activity设置默认背景 
<style name="Activity_Style" parent="@android:Theme.Holo.Light.NoActionBar">
<item name="android:background">@drawable/*</item>
</style>

3、对于在需要时才显示的图片或者布局,可以使用ViewStub标签,通过sdk/tools目录下的hierarchyviewer.bat查看布局文件会发现,使用viewstub标签的组件几乎不消耗布局的时间,在代码中当需要显示时再去实例化有助于提高Activity的布局效率和节省Activity消耗的内存。

 

注意:如果使用到WebView、视频播放、手写、动画等功能时,关掉硬件加速会严重音效程序的运行效率,这种情况可以只关闭掉Activity中某些view的硬件加速,整个Activity的硬件加速不关闭。

??  如果Activity中某个View需要关闭硬件加速,但整个Activity不能关闭,可以调用view层级关闭硬件加速的方法:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);  // view.setLayerType || 在定义view的构造方法中调用该方法
 
 














以上是关于安卓代码中,我有五张图片,设置一个button,如何点击一次button就切换下一张图片的主要内容,如果未能解决你的问题,请参考以下文章

将风味图放在布局的ImageView中

怎样设置Qpushbutton 的大小

VS2008如何用代码改变按钮背景颜色,字体大小和颜色

并排合并图像(水平)

安卓 编程如何为一个图片加上透明度和平移两个动画

安卓中如何添加显示gif动态图片?