80,471
社区成员




看情况应该是framelayout没有刷新,这样,当然要换图片的时候,把framelayout先remove掉子view,再重新添加进去
还有个问题,你这个imageview是动态生成的吗?
frameLayout.addView(guideImage); 这个代码要放在创建完guideImage之后, 都调用invalidate了,还没添加到layout里,怎么会有用???
多贴点代码,看不出来哪块不正常
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);// 添加引导图片
}
}
}
[quote=引用 4 楼 oBehavior 的回复:]
到底这么用啊,本人菜鸟哦,我不会哦
[quote=引用 5 楼 hjq2013 的回复:] [quote=引用 4 楼 oBehavior 的回复:]到底这么用啊,本人菜鸟哦,我不会哦
[quote=引用 4 楼 oBehavior 的回复:]到底这么用啊,本人菜鸟哦,我不会哦
到底这么用啊,本人菜鸟哦,我不会哦
* 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()