ImageView重新指定数据源的问题

敌花师 2015-06-23 03:24:52
guideImage为ImageView对象,原先设置了数据源,根据触发的事件重新指定数据源,有时候好用,有时候不变啊
赋值方式guideImage.setImageResource(imageId);,在重新指定数据源后我调用了imageview的refreshDrawableState,可是照样不理我,help me,大婶
...全文
211 点赞 收藏 23
写回复
23 条回复
tu451953337 2015年06月25日
引用 22楼tu451953337 的回复:
赔钱,n+1
手机端搞错帖子了
回复 点赞
tu451953337 2015年06月25日
赔钱,n+1
回复 点赞
敌花师 2015年06月23日
引用 16 楼 heaimnmn 的回复:
看情况应该是framelayout没有刷新,这样,当然要换图片的时候,把framelayout先remove掉子view,再重新添加进去
解决了,是我思路有问题,谢了
回复 点赞
Hare_ 2015年06月23日
引用 14 楼 oBehavior 的回复:
[quote=引用 13 楼 hjq2013 的回复:] frameLayout.addView(guideImage); 这个代码要放在创建完guideImage之后, 都调用invalidate了,还没添加到layout里,怎么会有用???
那是事件,frameLayout.addView(guideImage);不属于事件里面,是在触发事件前[/quote] 看错了, 你这是要自己实现个左右滑动图片的效果 用ViewPager搞吧
回复 点赞
小馅饼 2015年06月23日
试试在赋值前,通过isRecycle判断和recycle回收下
回复 点赞
哎,真难 2015年06月23日
引用 17 楼 oBehavior 的回复:
引用 16 楼 heaimnmn 的回复:
看情况应该是framelayout没有刷新,这样,当然要换图片的时候,把framelayout先remove掉子view,再重新添加进去
有时候正常,有时候不好用啊,这我完全不懂
你必须要触发了UI刷新,UI线程才会去刷新framelayout,比如下拉,比如跳转某个activity回来,所以你在点击事件的时候要刷新framelayout
回复 点赞
敌花师 2015年06月23日
引用 16 楼 heaimnmn 的回复:
看情况应该是framelayout没有刷新,这样,当然要换图片的时候,把framelayout先remove掉子view,再重新添加进去
有时候正常,有时候不好用啊,这我完全不懂
回复 点赞
哎,真难 2015年06月23日
看情况应该是framelayout没有刷新,这样,当然要换图片的时候,把framelayout先remove掉子view,再重新添加进去
回复 点赞
敌花师 2015年06月23日
引用 12 楼 heaimnmn 的回复:
还有个问题,你这个imageview是动态生成的吗?
大姐,上面有源码,写的不规范,凑合着看吧
回复 点赞
敌花师 2015年06月23日
引用 13 楼 hjq2013 的回复:
frameLayout.addView(guideImage); 这个代码要放在创建完guideImage之后, 都调用invalidate了,还没添加到layout里,怎么会有用???
那是事件,frameLayout.addView(guideImage);不属于事件里面,是在触发事件前
回复 点赞
Hare_ 2015年06月23日
frameLayout.addView(guideImage); 这个代码要放在创建完guideImage之后, 都调用invalidate了,还没添加到layout里,怎么会有用???
回复 点赞
哎,真难 2015年06月23日
还有个问题,你这个imageview是动态生成的吗?
回复 点赞
哎,真难 2015年06月23日
噢,100分的水源分么,哈哈,imageview已经绑定了控件,再前面加一句,setimageviewResource(null),然后再重新setimagetview试试
回复 点赞
敌花师 2015年06月23日
引用 9 楼 hjq2013 的回复:
多贴点代码,看不出来哪块不正常
我在做一个安装app有个基本介绍的欢迎导航,目前做做测试,源码如下: 调用
	Tools.setGuidImage(this, R.id.r1, R.drawable.p1, "FirstLogin");
Tools类
package com.example.navigatedemo;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnGenericMotionListener;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ImageView.ScaleType;

public class Tools {
	public static int shownumber = 1;// 当前正在展示的图片下表

	static float mPosX = 0;
	static float mPosY = 0;
	static float mCurrentPosX = 0;
	static float mCurrentPosY = 0;

	/**
	 * 弹出相关的提示
	 * 
	 * @param context
	 * @param xmlSoruce
	 */
	public static void toastShow(Context context, String xmlSoruce) {
		Toast toast = null;

		toast = Toast.makeText(context, xmlSoruce, Toast.LENGTH_LONG);
		toast.setGravity(Gravity.CENTER, 0, 0);
		toast.show();
	}

	/**
	 * @author lianglin
	 * @param act
	 *            The Activity which invoke this function
	 * @param viewId
	 *            The view of the activity
	 * @param imageId
	 *            The guide image
	 * @param preferenceName
	 *            The sharePreference which save the flag whether first login in
	 * */
	public static void setGuidImage(final Activity act, int viewId,
			int imageId, String preferenceName) {
		@SuppressWarnings("static-access")
		SharedPreferences preferences = act.getSharedPreferences(
				preferenceName, act.MODE_PRIVATE);
		final SharedPreferences.Editor editor = preferences.edit();
		final String key = act.getClass().getName() + "_firstLogin";
		if (!preferences.contains(key)) {
			editor.putBoolean(key, true);
			editor.commit();
		}

		// 判断是否首次登陆
		/*
		 * if(!preferences.getBoolean(key, true)) return;
		 */

		View view = act.getWindow().getDecorView().findViewById(viewId);
		ViewParent viewParent = view.getParent();
		if (viewParent instanceof FrameLayout) {
			final FrameLayout frameLayout = (FrameLayout) viewParent;
			final ImageView guideImage = new ImageView(act.getApplication());
			FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
					ViewGroup.LayoutParams.MATCH_PARENT,
					ViewGroup.LayoutParams.MATCH_PARENT);
			guideImage.setLayoutParams(params);
			guideImage.setScaleType(ScaleType.FIT_XY);
			guideImage.setImageResource(imageId);
			/*
			 * guideImage.setOnClickListener(new View.OnClickListener() {
			 * 
			 * @Override public void onClick(View v) { switch(shownumber) { case
			 * 1: shownumber++; guideImage.setImageResource(R.drawable.p2);
			 * break; case 2: shownumber++;
			 * guideImage.setImageResource(R.drawable.p3); break; case 3:
			 * frameLayout.removeView(guideImage); editor.putBoolean(key,
			 * false); editor.commit(); break; }
			 * 
			 * 
			 * 
			 * } });
			 */
			// 设置图片的触碰事件
			guideImage.setOnTouchListener(new View.OnTouchListener() {

				@Override
				public boolean onTouch(View v, MotionEvent event) {
					switch (event.getAction()) {
					// 按下
					case MotionEvent.ACTION_DOWN:
						mPosX = event.getX();
						mPosY = event.getY();
						// toastShow(act.getApplicationContext(),
						// "按下按下按下按下按下按下mPosX:" + mPosX + "   mPosY:"
						// + mPosY);
						// Log.v("按下", "按下按下按下按下按下按下");
						// 移动
					case MotionEvent.ACTION_MOVE:
						mCurrentPosX = event.getX();
						mCurrentPosY = event.getY();
						// toastShow(act.getApplicationContext(),
						// "移动移动移动移动移动移动移动mCurrentPosX:"+mCurrentPosX+"    mCurrentPosY:"+mCurrentPosY);
						// Log.v("移动", "移动移动移动移动移动移动移动");
						break;

					// 拿起
					case MotionEvent.ACTION_UP:
						/*
						 * toastShow(act.getApplicationContext(),
						 * "拿起拿起拿起拿起拿起拿起mCurrentPosX:" + mCurrentPosX +
						 * "  mPosX:" + mPosX + "  mCurrentPosY:" + mCurrentPosY
						 * + "   mPosY:" + mPosY + "   mCurrentPosX - mPosX:" +
						 * (mCurrentPosX - mPosX) +
						 * "    Math.abs(mCurrentPosY - mPosY):" +
						 * Math.abs(mCurrentPosY - mPosY));
						 */
						// Log.v("拿起", "拿起拿起拿起拿起拿起拿起");

						// toastShow(act.getApplicationContext(),"Math.abs(mCurrentPosX - mPosX):"
						// +Math.abs(mCurrentPosX - mPosX)
						// +"     Math.abs(mCurrentPosY - mPosY):"+Math.abs(mCurrentPosY
						// - mPosY)
						// +"   \n mCurrentPosX:" + mCurrentPosX
						// + "  mPosX:" + mPosX
						// + "  mCurrentPosY:" + mCurrentPosY
						// + "   mPosY:" + mPosY);
						// x的值比y的值大,代表是横向x轴移动
						if ((int) Math.abs(mCurrentPosX - mPosX) > (int) Math
								.abs(mCurrentPosY - mPosY)) {
							// 如果拿起的点x值大于按下的点x值,代表向右滑动
							if (mCurrentPosX > mPosX) {
								switch (++shownumber) {
								case 2:
									guideImage.setImageResource(R.drawable.p2);
									guideImage.invalidate();
									break;
								case 3:
									guideImage.setImageResource(R.drawable.p3);
									guideImage.invalidate();
									break;
								case 4:
									shownumber = 1;
									guideImage.setImageResource(R.drawable.p1);
									guideImage.invalidate();
									/*
									 * frameLayout.removeView(guideImage);
									 * editor.putBoolean(key, false);
									 * editor.commit();
									 */
									break;
								}
							} else// 代表向左滑动
							{
								switch (--shownumber) {
								case 0:
								case 1:
									guideImage.setImageResource(R.drawable.p1);
									guideImage.invalidate();
									break;
								case 2:
									shownumber++;
									guideImage.setImageResource(R.drawable.p2);
									guideImage.invalidate();
									break;
								case 3:
									shownumber = 1;
									guideImage.setImageResource(R.drawable.p1);
									guideImage.invalidate();
									/*
									 * frameLayout.removeView(guideImage);
									 * editor.putBoolean(key, false);
									 * editor.commit();
									 */
									break;
								}
							}
						}
						// x的值比y的值小,代表是纵向y轴移动
						else {
							// 如果拿起的点y值大于按下的点y值,向下滑动
							if (mCurrentPosY > mPosY) {
								switch (++shownumber) {
								case 2:
									guideImage.setImageResource(R.drawable.p2);
									guideImage.invalidate();
									break;
								case 3:
									guideImage.setImageResource(R.drawable.p3);
									guideImage.invalidate();
									break;
								case 4:
									shownumber = 1;
									guideImage.setImageResource(R.drawable.p1);
									guideImage.invalidate();
									/*
									 * frameLayout.removeView(guideImage);
									 * editor.putBoolean(key, false);
									 * editor.commit();
									 */
									break;
								}
							} else// 代表向上滑动
							{
								switch (--shownumber) {
								case 0:
								case 1:
									guideImage.setImageResource(R.drawable.p1);
									guideImage.invalidate();
									break;
								case 2:
									shownumber++;
									guideImage.setImageResource(R.drawable.p2);
									guideImage.invalidate();
									break;
								case 3:
									shownumber = 1;
									guideImage.setImageResource(R.drawable.p1);
									guideImage.invalidate();
									/*
									 * frameLayout.removeView(guideImage);
									 * editor.putBoolean(key, false);
									 * editor.commit();
									 */
									break;
								}
							}

						}
						break;
					default:
						Log.v("default", "defaultdefaultdefaultdefaultdefault");
						break;
					}
					return true;
				}
			});

			frameLayout.addView(guideImage);// 添加引导图片

		}
	}
}
回复 点赞
Hare_ 2015年06月23日
多贴点代码,看不出来哪块不正常
回复 点赞
敌花师 2015年06月23日
引用 5 楼 hjq2013 的回复:
[quote=引用 4 楼 oBehavior 的回复:]
到底这么用啊,本人菜鸟哦,我不会哦

设置完新的图片资源后,调用imageview的invalidate方法[/quote]断点调试,效果能出来,可是如果不是断点,表示还是不鸟我
回复 点赞
Hare_ 2015年06月23日
引用 6 楼 oBehavior 的回复:
[quote=引用 5 楼 hjq2013 的回复:] [quote=引用 4 楼 oBehavior 的回复:] 到底这么用啊,本人菜鸟哦,我不会哦
设置完新的图片资源后,调用imageview的invalidate方法[/quote]不好用啊,你看我思路哪里出了问题了么,首先ImageView我设置了默认的数据源,然后给这个imageview绑定了事件,代码如下:guideImage.setImageResource(R.drawable.p1);guideImage.invalidate();,然后就是不好用,没效果,help[/quote] imageView.setImageResource(isDefault?R.drawable.animal11:R.drawable.animal10); 我测试的 可以一直的换图片
回复 点赞
敌花师 2015年06月23日
引用 5 楼 hjq2013 的回复:
[quote=引用 4 楼 oBehavior 的回复:] 到底这么用啊,本人菜鸟哦,我不会哦
设置完新的图片资源后,调用imageview的invalidate方法[/quote]不好用啊,你看我思路哪里出了问题了么,首先ImageView我设置了默认的数据源,然后给这个imageview绑定了事件,代码如下:guideImage.setImageResource(R.drawable.p1);guideImage.invalidate();,然后就是不好用,没效果,help
回复 点赞
Hare_ 2015年06月23日
引用 4 楼 oBehavior 的回复:
到底这么用啊,本人菜鸟哦,我不会哦
设置完新的图片资源后,调用imageview的invalidate方法
回复 点赞
敌花师 2015年06月23日
引用 3 楼 hjq2013 的回复:
* Call this to force a view to update its drawable state. This will cause * drawableStateChanged to be called on this view. Views that are interested * in the new state should call getDrawableState. refreshDrawableState 这个方法不是刷新imageview资源重新显示的, 试试这个方法 Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, call postInvalidate(). void android.view.View.invalidate()
到底这么用啊,本人菜鸟哦,我不会哦
回复 点赞
发动态
发帖子
Android
创建于2009-10-09

4.6w+

社区成员

9.0w+

社区内容

移动平台 Android
社区公告
暂无公告