ImageView重新指定数据源的问题

敌花师 2015-06-23 03:24:52
guideImage为ImageView对象,原先设置了数据源,根据触发的事件重新指定数据源,有时候好用,有时候不变啊
赋值方式guideImage.setImageResource(imageId);,在重新指定数据源后我调用了imageview的refreshDrawableState,可是照样不理我,help me,大婶
...全文
257 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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()
到底这么用啊,本人菜鸟哦,我不会哦
加载更多回复(3)

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧