80,479
社区成员
发帖
与我相关
我的任务
分享
解决了,是我思路有问题,谢了
你这是要自己实现个左右滑动图片的效果
用ViewPager搞吧
看情况应该是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 的回复:]到底这么用啊,本人菜鸟哦,我不会哦
不好用啊,你看我思路哪里出了问题了么,首先ImageView我设置了默认的数据源,然后给这个imageview绑定了事件,代码如下:guideImage.setImageResource(R.drawable.p1);guideImage.invalidate();,然后就是不好用,没效果,help[/quote]
imageView.setImageResource(isDefault?R.drawable.animal11:R.drawable.animal10);
我测试的
可以一直的换图片[quote=引用 4 楼 oBehavior 的回复:]到底这么用啊,本人菜鸟哦,我不会哦
不好用啊,你看我思路哪里出了问题了么,首先ImageView我设置了默认的数据源,然后给这个imageview绑定了事件,代码如下:guideImage.setImageResource(R.drawable.p1);guideImage.invalidate();,然后就是不好用,没效果,help到底这么用啊,本人菜鸟哦,我不会哦
* 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()
到底这么用啊,本人菜鸟哦,我不会哦