MainActivity.java //主入口类
package com.myviewgroup.chen;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.LinearLayout;
public class MainActivity extends Activity {
private MyViewGroup viewGroup;
private PageControlView pageControl;
private LinearLayout linearLayout3 ;
private LinearLayout linearLayout2;
private LinearLayout linearLayout ;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
viewGroup = (MyViewGroup) this.findViewById(R.id.homemenuMyViewGroup);
pageControl = (PageControlView) findViewById(R.id.homemenuPageControl);
viewGroup.removeAllViews();
//这里加几个页面就显示几个画面和几个点
viewGroup.addView(View.inflate(MainActivity.this, R.layout.myview1, null));
viewGroup.addView(View.inflate(MainActivity.this, R.layout.myview2, null));
viewGroup.addView(View.inflate(MainActivity.this, R.layout.myview3, null));
linearLayout = (LinearLayout) View.inflate(this, R.layout.myview1, null);
linearLayout2 = (LinearLayout) View.inflate(this, R.layout.myview2, null);
linearLayout3 = (LinearLayout) View.inflate(this, R.layout.myview3, null);
viewGroup.setCurrentScreenIndex(1);
pageControl.setCount(viewGroup.getChildCount());
pageControl.generatePageControl(1);
viewGroup.setScrollToScreenCallback(pageControl);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
System.out.println();
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
if (linearLayout.isFocused()) {
viewGroup.scrollToScreen(0, 200);
} else if (linearLayout2.isFocused()) {
viewGroup.scrollToScreen(1, 200);
}else if(linearLayout3.isFocused()){
viewGroup.scrollToScreen(2, 200);
}
}
return super.onKeyDown(keyCode, event);
}
}
MyViewGroup.java //主页面的实现继承ViewGroup
package com.myviewgroup.chen;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.GestureDetector.OnGestureListener;
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;
}
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() {
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
public void onShowPress(MotionEvent e) {
}
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;
}
public void onLongPress(MotionEvent e) {
}
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;
}
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());
}
//初始化显示第几个界面
int delta = currentScreenIndex * getWidth() - getScrollX();
scroller.startScroll(getScrollX(), 0, delta, 0, 0);
invalidate();
}
@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);
}
}
public void scrollToScreen(int whichScreen, int duration) {
if (getFocusedChild() != null && whichScreen != currentScreenIndex
&& getFocusedChild() == getChildAt(currentScreenIndex)) {
getFocusedChild().clearFocus();
}
final int delta = whichScreen * getWidth() - getScrollX();
scroller.startScroll(getScrollX(), 0, delta, 0, duration);
invalidate();
currentScreenIndex = whichScreen;
if (scrollToScreenCallback != null) {
scrollToScreenCallback
.callback(currentScreenIndex);
}
}
/**
*/
private void snapToDestination() {
scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());
}
interface ScrollToScreenCallback {
public void callback(int currentIndex);
}
public void setCurrentScreenIndex(int currentScreenIndex) {
this.currentScreenIndex = currentScreenIndex;
}
public int getCurrentScreenIndex() {
return this.currentScreenIndex;
}
}
// 控制点点的实现
PageControlView.java
package com.myviewgroup.chen;
import com.myviewgroup.chen.MyViewGroup.ScrollToScreenCallback;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
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;
}
public void callback(int currentIndex) {
generatePageControl(currentIndex);
}
public void generatePageControl(int currentIndex) {
this.removeAllViews();
LayoutParams mParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mParams.rightMargin=45;
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, mParams);
}
}
}
主界面 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout android:id="@+id/home_menu_layout"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:gravity="center" android:orientation="vertical">
<com.myviewgroup.chen.MyViewGroup
android:layout_marginTop="1px" android:id="@+id/homemenuMyViewGroup"
android:layout_width="fill_parent" android:layout_height="400px"
android:gravity="center" />
<com.myviewgroup.chen.PageControlView
android:id="@+id/homemenuPageControl" android:layout_width="fill_parent"
android:layout_height="50px" android:layout_alignParentBottom="true"
android:gravity="center" />
</LinearLayout>
</LinearLayout>
//加入的页面
myview1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#778899" >
</LinearLayout>
myview1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#FF0000" >
</LinearLayout>http://my.csdn.net/uploads/201206/21/1340274651_4667.png " _xhe_src="http://my.csdn.net/uploads/201206/21/1340274651_4667.png "/><img src="<font><font class=" "="">http://my.csdn.net/uploads/201206/21/1340274651_4667.png " _xhe_src="http://my.csdn.net/uploads/201206/21/1340274651_4667.png
"/>
myview1.xml
<img src="<font><font class=" "="">http://my.csdn.net/uploads/201206/21/1340274651_4667.png " _xhe_src="http://my.csdn.net/uploads/201206/21/1340274651_4667.png "/>![]()
![]()
分享到:
相关推荐
弹幕效果,也就是我们常说的“滚动字幕”,它可以让用户在屏幕上看到一条条文字信息从屏幕的一端滑动到另一端。本文将详细讲解如何在Android中通过自定义ViewGroup来实现这一功能。 首先,我们要理解Android中的...
在Android应用开发中,创建一个用户友好的界面是至关重要的,尤其当涉及到界面滑动和导航栏同步操作时。这个“Android界面滑动,导航栏同步滑动”的项目就是一个很好的学习资源,它提供了清晰易懂的示例代码,旨在...
在Android应用开发中,创建一个可以滑动切换的标签页布局是常见的需求,这能提供良好的用户...在实际项目中,还可以根据需求进行自定义,如添加动画效果、改变滑动指示器样式等,以提升应用的视觉吸引力和用户体验。
在Android开发中,弹幕效果通常用于视频播放或者互动场景,为用户提供一种新颖的互动方式。"android 弹幕效果"这个主题涉及到的是如何在Android应用中实现类似电视弹幕的功能,让用户能够在屏幕上发送和显示飘过的...
在Android开发中,实现左右滑动屏幕是一种常见的交互方式,特别是在设计导航或者浏览内容时。这一功能通常是通过创建一个可以滚动的视图容器,比如ViewPager,来实现的。以下是对这个主题的详细解释: 1. **...
在Android开发中,实现垂直滚动弹幕或者垂直滚动新闻效果是一项常见的需求,尤其适用于展示滚动信息、广告或者新闻更新。这种效果通常会在屏幕顶部或底部以动态的方式展示内容,吸引用户的注意力。以下将详细讲解...
总结来说,这个Android项目中的弹幕功能涉及到视频播放、用户交互、文本处理、布局管理、动画效果等多个方面,通过学习和实践这些知识点,开发者可以创建出富有互动性的多媒体应用,提升用户体验。提供的`Danmaku`...
本篇将深入讲解`ViewPager`与`Fragment`结合实现滑动效果的知识点。 1. **ViewPager基本概念** ViewPager是Android Support Library的一部分,用于展示可滑动的页面序列。它内部实现了滑动手势的处理,使得用户...
总结,Fragment在Android应用中提供了强大的UI构建能力,结合ViewPager,我们可以实现流畅的页面滑动效果。在启动页和内部主体页中,Fragment可以帮助我们更好地组织代码,提高代码复用性,同时提供更加动态和交互式...
弹幕通常是一种文字或者图片从屏幕的一端滑动到另一端的效果,常见于视频播放软件中。在Android中,我们可以用以下方式实现: 1. 创建弹幕数据模型:定义一个包含弹幕文本、颜色、速度等属性的类。 2. 弹幕容器:...
6. 自定义功能:除了基本的弹幕滑动效果,还可以进一步扩展XCDanmuView的功能,例如增加文本样式控制、速度调整、动态加载弹幕内容、暂停/恢复弹幕显示等。 总之,实现自定义的Android弹幕效果需要结合自定义View、...
在Android开发中,实现弹幕效果是一项常见的需求,特别是在音乐、视频或直播应用中,弹幕功能能够增强用户的互动体验。本示例“android实现简单弹幕代码”将指导你如何在Android应用中添加这样的功能。 首先,我们...
"Fragment菜单滑动效果"指的是在Android应用中实现的一种交互式界面设计,其中主菜单可以通过左右滑动来显示或隐藏侧边菜单。 这个设计通常用于导航,左侧菜单可能包含应用的主要类别,而右侧菜单则可能提供更多的...
`AndroidTVWheelViewSimple`项目是专为Android TV平台设计的一个滑动列表控件,它增强了标准的Android UI元素,使得在大屏幕设备上浏览和选择内容更加直观和高效。 这个控件的核心功能是`WheelView`,它是一种可以...
是一款支持弹幕功能的视频播放器中所带的功能,除了弹幕功能外,还有诸多的界面效果,比如顶部的导航栏集成了手动点击与手动滑动在一起、导航栏固定不随listview的滚动而滚动等,对学习Android的界面UI编程有帮助。
在Android应用中,弹幕效果通常是指文本信息在屏幕横向或纵向滑动的效果。 二、实现思路 1. 数据结构:首先,我们需要一个数据结构来存储弹幕信息,包括文字内容、颜色、大小、速度等属性。 2. 控件布局:创建一个...
- **动画效果**:流畅的过渡动画可以提升用户体验,使用Android提供的动画API可以实现平滑的滑动效果。 - **响应式设计**:考虑到不同屏幕尺寸和方向,菜单应能适应各种设备。 - **菜单内容**:菜单项应简洁明了,...
在Android开发中,"android碎片分页效果"是一种常见的用户界面设计,用于在平板电脑或大屏幕设备上展示大量内容。这种设计模式通常利用`Fragment`(碎片)和`PagerAdapter`(分页适配器)来实现,允许用户水平或垂直...
对于电视关闭动画,可能涉及视图的渐隐、滑动或者缩放效果。例如,一个常见的动画设计是屏幕从四周向中心逐渐变暗,同时电视屏幕的内容像被拉远一样逐渐缩小,直到整个画面消失,模拟真实的电视关闭过程。这需要通过...
在弹幕展示中,我们需要为每个弹幕创建一个动画,设置其起始位置、结束位置以及动画时长,从而模拟弹幕从屏幕边缘进入并消失的效果。同时,通过调整动画的时长,可以控制不同弹幕的速度,使得弹幕展示更加生动。 在...