Android自定义view课表
Rose J 人气:0这里是模拟课表,数据写死了的,不过也可以通过抓包获取教务系统课表
1.xml文件
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:background="#A5D6A7" android:fitsSystemWindows="true" android:layout_height="match_parent" tools:context=".KebiaoActivity"> <!-- <com.baidu.lbsapi.panoramaview.PanoramaView--> <!-- android:id="@+id/panorama"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent"--> <!-- android:clickable="true" />--> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/constraintLayout" android:layout_width="match_parent" android:layout_height="250dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <ImageView android:id="@+id/back" android:layout_width="25dp" android:layout_height="25dp" android:layout_marginStart="15dp" app:layout_constraintBottom_toBottomOf="@+id/textView16" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/textView16" app:srcCompat="@mipmap/fanhui" android:layout_marginLeft="15dp" /> <TextView android:id="@+id/textView16" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="课表" android:textColor="#ffffff" android:textSize="26sp" android:layout_marginTop="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.25" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/ershou" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="本周课表" android:textColor="@color/white" android:textSize="60sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.45" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Schedule of the week" android:textColor="@color/white" android:textSize="20sp" android:layout_marginTop="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.7" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/ershou" /> </androidx.constraintlayout.widget.ConstraintLayout> <RelativeLayout android:id="@+id/kebiao22" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/constraintLayout"> <TextView android:id="@+id/test_empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="11\n月" android:gravity="center" android:background="@drawable/course_text_view_bg" /> <TextView android:id="@+id/test_monday_course" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="23日\n周一" android:layout_toRightOf="@id/test_empty" android:background="@drawable/course_text_view_bg" android:gravity="center" /> <TextView android:id="@+id/test_tuesday_course" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="24日\n周二" android:layout_toRightOf="@id/test_monday_course" android:background="@drawable/course_text_view_bg" android:gravity="center" /> <TextView android:id="@+id/test_wednesday_course" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="25日\n周三" android:layout_toRightOf="@id/test_tuesday_course" android:background="@drawable/course_text_view_bg" android:gravity="center" /> <TextView android:id="@+id/test_thursday_course" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="26日\n周四" android:layout_toRightOf="@id/test_wednesday_course" android:background="@drawable/course_text_view_bg" android:gravity="center" /> <TextView android:id="@+id/test_friday_course" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="27日\n周五" android:layout_toRightOf="@id/test_thursday_course" android:background="@drawable/course_text_view_bg" android:gravity="center" /> <TextView android:id="@+id/test_saturday_course" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="28日\n周六" android:layout_toRightOf="@id/test_friday_course" android:background="@drawable/course_text_view_bg" android:gravity="center" /> <TextView android:id="@+id/test_sunday_course" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="29日\n周日" android:layout_toRightOf="@id/test_saturday_course" android:background="@drawable/course_text_view_bg" android:gravity="center" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="800dp" android:id="@+id/test_course_rl" app:layout_constraintTop_toBottomOf="@id/kebiao22" > </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView>
course_text_view_bg
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#ffffff"/> <stroke android:width="0.2dp" android:color="#AEAAAA"/> </shape>
2.activity代码
public class KebiaoActivity extends AppCompatActivity { /** 第一个无内容的格子 */ protected TextView empty; /** 星期一的格子 */ protected TextView monColum; /** 星期二的格子 */ protected TextView tueColum; /** 星期三的格子 */ protected TextView wedColum; /** 星期四的格子 */ protected TextView thrusColum; /** 星期五的格子 */ protected TextView friColum; /** 星期六的格子 */ protected TextView satColum; /** 星期日的格子 */ protected TextView sunColum; /** 课程表body部分布局 */ protected RelativeLayout course_table_layout; /** 屏幕宽度 **/ protected int screenWidth; /** 课程格子平均宽度 **/ protected int aveWidth; int gridHeight1 = 0; //(0)对应12节;(2)对应34节;(4)对应56节;(6)对应78节;(8)对应于9 10节 int[] jieci = {0,2,3,5,4,6,8}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= 21){ View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); getWindow().setStatusBarColor(Color.TRANSPARENT); } setContentView(R.layout.activity_kebiao); ImageView mImageView=findViewById(R.id.back); mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); //获得列头的控件 empty = (TextView) this.findViewById(R.id.test_empty); monColum = (TextView) this.findViewById(R.id.test_monday_course); tueColum = (TextView) this.findViewById(R.id.test_tuesday_course); wedColum = (TextView) this.findViewById(R.id.test_wednesday_course); thrusColum = (TextView) this.findViewById(R.id.test_thursday_course); friColum = (TextView) this.findViewById(R.id.test_friday_course); satColum = (TextView) this.findViewById(R.id.test_saturday_course); sunColum = (TextView) this.findViewById(R.id.test_sunday_course); course_table_layout = (RelativeLayout) this.findViewById(R.id.test_course_rl); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); //屏幕宽度 int width = dm.widthPixels; //平均宽度 int aveWidth = width / 8; //第一个空白格子设置为25宽 empty.setWidth(aveWidth * 3/4); monColum.setWidth(aveWidth * 33/32 + 1); tueColum.setWidth(aveWidth * 33/32 + 1); wedColum.setWidth(aveWidth * 33/32 + 1); thrusColum.setWidth(aveWidth * 33/32 + 1); friColum.setWidth(aveWidth * 33/32 + 1); satColum.setWidth(aveWidth * 33/32 + 1); sunColum.setWidth(aveWidth * 33/32 + 1); this.screenWidth = width; this.aveWidth = aveWidth; int height = dm.heightPixels; int gridHeight = height / 10; gridHeight1 = gridHeight; //设置课表界面 //动态生成10 * maxCourseNum个textview for(int i = 1; i <= 12; i ++){ for(int j = 1; j <= 8; j ++){ TextView tx = new TextView(KebiaoActivity.this); tx.setId((i - 1) * 8 + j); //除了最后一列,都使用course_text_view_bg背景(最后一列没有右边框) tx.setBackgroundDrawable(KebiaoActivity.this. getResources().getDrawable(R.drawable.course_text_view_bg)); //相对布局参数 RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams( aveWidth * 33 / 32 + 1, gridHeight); //文字对齐方式 tx.setGravity(Gravity.CENTER); //字体样式 // tx.setTextAppearance(this, R.style.courseTableText); // //如果是第一列,需要设置课的序号(1 到 12) if(j == 1) { tx.setText(String.valueOf(i)); rp.width = aveWidth * 3/4; //设置他们的相对位置 if(i == 1) rp.addRule(RelativeLayout.BELOW, empty.getId()); else rp.addRule(RelativeLayout.BELOW, (i - 1) * 8); } else { rp.addRule(RelativeLayout.RIGHT_OF, (i - 1) * 8 + j - 1); rp.addRule(RelativeLayout.ALIGN_TOP, (i - 1) * 8 + j - 1); tx.setText(""); } tx.setLayoutParams(rp); course_table_layout.addView(tx); } } setCourseMessage(1,jieci[1],"软件工\n程@含\n浦校区\n3508教\n室\n"); setCourseMessage2(2,jieci[0],"嵌入式\n系统...\n@含浦\n校区\n3204教\n室"); setCourseMessage(3,jieci[1],"计算机\n图形\n学@含\n浦校区\n3310教\n室"); setCourseMessage2(4,jieci[0],"计算机\n网络...\n@含浦\n校区\n3311教\n室"); setCourseMessage2(5,jieci[0],"嵌入式\n系统...\n@h含浦\n校区嵌入\n式实验室"); setCourseMessage(5,jieci[1],"java...\n@h含浦\n校区12\n机房\n(65)"); setCourseMessage(1,jieci[3],"人工智\n能原\n理@含\n浦校区\n3306教\n"); setCourseMessage2(2,jieci[2],"计算机\n网络...\n@含浦\n校区\n2204教\n室"); setCourseMessage(5,jieci[3],"操作系\n统原\n理@含\n浦校区\n12机房\n(65)"); } //菜单 // @Override // public boolean onCreateOptionsMenu(Menu menu) { // // Inflate the menu; this adds items to the action bar if it is present. // getMenuInflater().inflate(R.menu.main, menu); // return true; // } public void setCourseMessage(int xingqi,int jieci,String courseMessage){ //五种颜色的背景 int[] background = {R.drawable.course_info_blue, R.drawable.course_info_green, R.drawable.course_info_red, R.drawable.course_info_zisi, R.drawable.course_info_yellow}; // 添加课程信息 TextView courseInfo = new TextView(this); courseInfo.setText(courseMessage); //该textview的高度根据其节数的跨度来设置 RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams( aveWidth * 31 / 32, (gridHeight1 - 5) * 3 ); //textview的位置由课程开始节数和上课的时间(day of week)确定 rlp.topMargin = 5 + jieci * gridHeight1; rlp.leftMargin = 5; // 偏移由这节课是星期几决定 rlp.addRule(RelativeLayout.RIGHT_OF, xingqi); //字体剧中 courseInfo.setGravity(Gravity.CENTER); // 设置一种背景 Random random = new Random(); courseInfo.setBackgroundResource(background[random.nextInt(5)]); courseInfo.setTextSize(12); courseInfo.setLayoutParams(rlp); courseInfo.setTextColor(Color.WHITE); //设置不透明度 courseInfo.getBackground().setAlpha(222); course_table_layout.addView(courseInfo); } public void setCourseMessage2(int xingqi,int jieci,String courseMessage){ //五种颜色的背景 int[] background = {R.drawable.course_info_blue, R.drawable.course_info_green, R.drawable.course_info_red, R.drawable.course_info_zisi, R.drawable.course_info_yellow}; // 添加课程信息 TextView courseInfo = new TextView(this); courseInfo.setText(courseMessage); //该textview的高度根据其节数的跨度来设置 RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams( aveWidth * 31 / 32, (gridHeight1 - 5) * 2 ); //textview的位置由课程开始节数和上课的时间(day of week)确定 rlp.topMargin = 5 + jieci * gridHeight1; rlp.leftMargin = 5; // 偏移由这节课是星期几决定 rlp.addRule(RelativeLayout.RIGHT_OF, xingqi); //字体剧中 courseInfo.setGravity(Gravity.CENTER); // 设置一种背景 Random random = new Random(); courseInfo.setBackgroundResource(background[random.nextInt(5)]); courseInfo.setTextSize(12); courseInfo.setLayoutParams(rlp); courseInfo.setTextColor(Color.WHITE); //设置不透明度 courseInfo.getBackground().setAlpha(222); course_table_layout.addView(courseInfo); } }
3.资源文件
course_info_blue
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#4FC3F7"/> </shape>
course_info_green
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#81C784"/> </shape>
course_info_red
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#E57373"/> </shape>
course_info_zisi
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#9575CD"/> </shape>
course_info_yellow
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#FFB74D"/> </shape>
4.运行
加载全部内容