小弟最近写了一个例子:
代码如下:
我想实现的事情是:当你点击一幅图像时,可以启动另一个Intent或者是Activity,
希望哪位高手能够指点一下。
package com.easymorse.scroll;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;public class ScrollDemosActivity extends Activity { @SuppressWarnings("unused")
private static final String TAG = "scroller"; private MyViewGroup viewGroup; private PageControlView pageControl; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main);
viewGroup = (MyViewGroup) findViewById(R.id.myViewGroup); ImageView imageView = new ImageView(this);
imageView.setImageDrawable(getResources().getDrawable(R.drawable.a1));
viewGroup.addView(imageView); viewGroup.addView(View.inflate(this, R.layout.form, null)); imageView = new ImageView(this);
imageView.setImageDrawable(getResources().getDrawable(R.drawable.a2));
viewGroup.addView(imageView); pageControl=(PageControlView) findViewById(R.id.pageControl);
pageControl.setCount(viewGroup.getChildCount());
pageControl.generatePageControl(0);
viewGroup.setScrollToScreenCallback(pageControl);
}
}
这是MyViewGroup.java
我估计要在这段代码里面实现启动另一个Intent或者Activity;但是我自己试了一些方法不成功。
package com.easymorse.scroll;import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;public class MyViewGroup extends ViewGroup { private static final String TAG = "scroller"; private Scroller scroller; private int currentScreenIndex; private GestureDetector gestureDetector; private ScrollToScreenCallback scrollToScreenCallback; public void setScrollToScreenCallback(
ScrollToScreenCallback scrollToScreenCallback) {
this.scrollToScreenCallback = scrollToScreenCallback;
} // 设置一个标志位,防止底层的onTouch事件重复处理UP事件
private boolean fling; public MyViewGroup(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
} public MyViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
} public MyViewGroup(Context context) {
super(context);
initView(context);
} private void initView(final Context context) {
this.scroller = new Scroller(context); this.gestureDetector = new GestureDetector(new OnGestureListener() { @Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
} @Override
public void onShowPress(MotionEvent e) {
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
if ((distanceX > 0 && currentScreenIndex < getChildCount() - 1)// 防止移动过最后一页
|| (distanceX < 0 && getScrollX() > 0)) {// 防止向第一页之前移动
scrollBy((int) distanceX, 0);
}
return true;
} @Override
public void onLongPress(MotionEvent e) {
} @Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
Log.d(TAG, "min velocity >>>"
+ ViewConfiguration.get(context)
.getScaledMinimumFlingVelocity()
+ " current velocity>>" + velocityX);
if (Math.abs(velocityX) > ViewConfiguration.get(context)
.getScaledMinimumFlingVelocity()) {// 判断是否达到最小轻松速度,取绝对值的
if (velocityX > 0 && currentScreenIndex > 0) {
Log.d(TAG, ">>>>fling to left");
fling = true;
scrollToScreen(currentScreenIndex - 1);
} else if (velocityX < 0
&& currentScreenIndex < getChildCount() - 1) {
Log.d(TAG, ">>>>fling to right");
fling = true;
scrollToScreen(currentScreenIndex + 1);
}
} return true;
} @Override
public boolean onDown(MotionEvent e) {
return false;
}
});
} @Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
Log.d(TAG, ">>left: " + left + " top: " + top + " right: " + right
+ " bottom:" + bottom); /**
 * 设置布局,将子视图顺序横屏排列
 */
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.setVisibility(View.VISIBLE);
child.measure(right - left, bottom - top);
child.layout(0 + i * getWidth(), 0, getWidth() + i * getWidth(),
getHeight());
}
} @Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), 0);
postInvalidate();
}
} @Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event); switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
if (!fling) {
snapToDestination();
}
fling = false;
break;
default:
break;
}
return true;
} /**
 * 切换到指定屏
 * 
 * @param whichScreen
 */
public void scrollToScreen(int whichScreen) {
if (getFocusedChild() != null && whichScreen != currentScreenIndex
&& getFocusedChild() == getChildAt(currentScreenIndex)) {
getFocusedChild().clearFocus();
} final int delta = whichScreen * getWidth() - getScrollX();
scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
invalidate(); currentScreenIndex = whichScreen;
if (scrollToScreenCallback != null) {
scrollToScreenCallback
.callback(currentScreenIndex);
}
} /**
 * 根据当前x坐标位置确定切换到第几屏
 */
private void snapToDestination() {
scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());
} interface ScrollToScreenCallback {
public void callback(int currentIndex);
}
}package com.easymorse.scroll;import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;import com.easymorse.scroll.MyViewGroup.ScrollToScreenCallback;public class PageControlView extends LinearLayout implements
ScrollToScreenCallback { private int count; private Context context; public void setCount(int count) {
this.count = count;
} public PageControlView(Context context, AttributeSet attrs) {
super(context, attrs);
this.init(context);
} public PageControlView(Context context) {
super(context);
this.init(context);
} private void init(Context context) {
this.context=context;
} @Override
public void callback(int currentIndex) {
generatePageControl(currentIndex);
} public void generatePageControl(int currentIndex) {
this.removeAllViews(); for (int i = 0; i < this.count; i++) {
ImageView imageView = new ImageView(context);
if (currentIndex == i) {
imageView.setImageResource(R.drawable.page_indicator_focused);
} else {
imageView.setImageResource(R.drawable.page_indicator);
}
this.addView(imageView);
}
}
}

解决方案 »

  1.   

    用Intent就可以启动,new Intent(Object,class),用startActivity(intent),多利用android的文档
      

  2.   

    楼主的这段代码是看开源的翻页效果吧?这个跟事件分发和传递有关。因为你的Group里面将子View的点击事件拦截了,也就无法实现子View的点击事件了。如一定要实现子View的点击事件,可以参考我的这个代码:
    模拟桌面(workspace)页面切换效果/循环切换页面===
    个人博客:www.girlcoding.com
      

  3.   

    模拟HTC的bar效果?
    ===
    个人博客:www.girlcoding.com