记得刚做机顶盒开发的时候,真的把我坑惨了,网上又找都不什么资料,所以只能自己慢慢摸索了。不过自己在其中也算是学到了一些知识,当然也遇到过许多的问题,所以了就希望把这些经验分享给其他刚开始步入机顶盒开发的开发者们,也省的到处找资料。
做机顶盒这块了,最麻烦的就是这个焦点问题了,因为机顶盒都是用遥控操作的,所以在界面上都需要有一个用户操作的焦点!!!下面就带大家写一个在机顶盒中经常用到的界面切换的程序。。。
程序有四个界面,按遥控的左右键,能切换到不同界面,下面是布局。(注:布局最好是新建一个layout-land文件夹存放)
activity_main:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/launch_bg"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RadioGroup
android:id="@+id/title_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="60dip"
android:orientation="horizontal"
android:paddingLeft="120dip"
android:paddingRight="60dip" >
<RadioButton
android:id="@+id/l1"
style="@style/TitleButton"
android:layout_width="180dip"
android:layout_height="wrap_content"
android:button="@null"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:nextFocusLeft="@+id/tv_show"
android:text="第一" />
<RadioButton
android:id="@+id/l2"
style="@style/TitleButton"
android:layout_width="180dip"
android:layout_height="wrap_content"
android:button="@null"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:text="第二" />
<RadioButton
android:id="@+id/l3"
style="@style/TitleButton"
android:layout_width="180dip"
android:layout_height="wrap_content"
android:button="@null"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:text="第三" />
<RadioButton
android:id="@+id/l4"
style="@style/TitleButton"
android:layout_width="180dip"
android:layout_height="wrap_content"
android:button="@null"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:nextFocusRight="@+id/settings"
android:text="第四" />
</RadioGroup>
<android.support.v4.view.ViewPager
android:id="@+id/main_layout_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginTop="100dp" />
</RelativeLayout>
RadioGroup的样式:定义了选中和未选中radiogroup的背景及颜色的改变。
<style name="TitleButton">
<item name="android:background">@drawable/title_button_selector</item>
<item name="android:textColor">@drawable/title_textcolor_selector</item>
<item name="android:textSize">25sp</item>
</style>
layout1:
<?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" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="这是第一个界面" />
</LinearLayout>
其他的三个布局文件都差不多,就不一一列举了。。。
接下来看 view1的编写:
import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
public class View1 extends LinearLayout {
private Context mContext;
public View1(Context context) {
super(context);
mContext = context;
}
public void initView() {
setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
setGravity(Gravity.CENTER_HORIZONTAL);
View root = LayoutInflater.from(mContext).inflate(R.layout.layout1,
null);
addView(root);
}
}
这里我继承了LinerrLayout,是为了能在mainactivity把我的view填充进去,其他的都比较简单了,后面的几个view也是这样,只不过就是布局不一样而已。
然后是我们的MainActivity:
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.RadioButton;
import android.widget.RadioGroup;
public class MainActivity extends Activity {
private View1 v1;
private View2 v2;
private View3 v3;
private View4 v4;
private ArrayList<View> pages = new ArrayList<View>();
private ViewPager centerPager;
private RadioGroup titleGroup;// 标签组
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
v1 = new View1(this);
v2 = new View2(this);
v3 = new View3(this);
v4 = new View4(this);
pages.add(v1);
pages.add(v2);
pages.add(v3);
pages.add(v4); // 添加页面
initView();
initListener();
}
private void initView() {
titleGroup = (RadioGroup) findViewById(R.id.title_group);
titleGroup.check(R.id.l1);
centerPager = (ViewPager) findViewById(R.id.main_layout_pager);
centerPager.setAdapter(new AllPagesAdapter(pages));
// 当前显示第一页
centerPager.setCurrentItem(0);
v1.initView();//加载页面
v2.initView();
v3.initView();
v4.initView();
}
<span style="white-space:pre"> </span>//对radiogroup的焦点监听,进行页面的切换
public void initListener() {
OnFocusChangeListener focusListener = new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
int position = (Integer) v.getTag();
centerPager.setCurrentItem(position, true);
}
}
};
for (int i = 0; i < titleGroup.getChildCount(); i++) {
View view = titleGroup.getChildAt(i);
view.setTag(i);
view.setOnFocusChangeListener(focusListener);
}
centerPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
if (arg0 < titleGroup.getChildCount()) {
((RadioButton) titleGroup.getChildAt(arg0))
.setChecked(true);
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
}
适配器代码:
import java.util.ArrayList;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
public class AllPagesAdapter extends PagerAdapter {
private ArrayList<View> views;
public AllPagesAdapter(ArrayList<View> views) {
super();
this.views = views;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View child = views.get(position);
container.addView(child);
return child;
}
@Override
public int getCount() {
return views.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
@Override
public Parcelable saveState() {
return null;
}
public void dataChanged(ArrayList<View> views) {
this.views = views;
notifyDataSetChanged();
}
}
代码都比较简单,就到这里了,以后还会继续编写一些有关机顶盒的开发的程序。。。。看下效果图: