BuWanVideo/res/drawable-xhdpi/ic_activity_main_search.pngBuWanVideo/res/drawable-xhdpi/ic_recommend_watch_history.pngBuWanVideo/res/drawable-xhdpi/icon_dialog_vip_new_item_input.png
BuWanVideo/res/drawable-xhdpi/icon_vip_dialog_close_new.png
BuWanVideo/res/drawable/shape_dialog_user_protocol_positive.xml
@@ -2,5 +2,5 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="40dp" /> <solid android:color="#4bb000" /> <solid android:color="@color/nav_highloght_text_color" /> </shape> BuWanVideo/res/drawable/shape_feedback_input_bg.xml
@@ -2,5 +2,5 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="5dp" /> <solid android:color="#ff6a6a6a" /> <solid android:color="@color/common_bg_color" /> </shape> BuWanVideo/res/drawable/shape_mine_functions_bg.xml
@@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/mine_item_container_bg_color" /> <corners android:radius="5dp" /> <corners android:radius="8dp" /> </shape> BuWanVideo/res/drawable/shape_new_dialog_vip_bg.xml
New file @@ -0,0 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:topLeftRadius="20dp" android:topRightRadius="20dp" /> <solid android:color="@color/vip_dialog_bg_color" /> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_bg.xml
@@ -4,7 +4,18 @@ <solid android:color="#ffffffff" /> <stroke android:width="1dp" android:color="#59000000"></stroke> <corners android:radius="16dp" /> android:color="#59bbbbbb" /> <corners android:bottomLeftRadius="16dp" android:bottomRightRadius="16dp" android:topLeftRadius="16dp" android:topRightRadius="16dp" /> <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp"></padding> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_bottom_item_bg.xml
New file @@ -0,0 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/white"></solid> <corners android:bottomLeftRadius="16dp" android:bottomRightRadius="16dp" android:topLeftRadius="0dp" android:topRightRadius="0dp" /> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_bottom_item_selected_bg.xml
New file @@ -0,0 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#F0F0F0"></solid> <corners android:bottomLeftRadius="16dp" android:bottomRightRadius="16dp" android:topLeftRadius="0dp" android:topRightRadius="0dp" /> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_middle_item_bg.xml
New file @@ -0,0 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/white"></solid> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_middle_item_selected_bg.xml
New file @@ -0,0 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#F0F0F0"></solid> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_single_item_bg.xml
New file @@ -0,0 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/white"></solid> <corners android:bottomLeftRadius="16dp" android:bottomRightRadius="16dp" android:topLeftRadius="16dp" android:topRightRadius="16dp" /> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_single_item_selected_bg.xml
New file @@ -0,0 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#F0F0F0"></solid> <corners android:bottomLeftRadius="16dp" android:bottomRightRadius="16dp" android:topLeftRadius="16dp" android:topRightRadius="16dp" /> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_top_item_bg.xml
New file @@ -0,0 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/white"></solid> <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="16dp" android:topRightRadius="16dp" /> </shape> BuWanVideo/res/drawable/shape_video_detail_resource_top_item_selected_bg.xml
New file @@ -0,0 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#F0F0F0"></solid> <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="16dp" android:topRightRadius="16dp" /> </shape> BuWanVideo/res/layout/activity_feedback.xml
@@ -23,8 +23,8 @@ android:lines="7" android:maxLength="500" android:padding="12dp" android:textColor="#CBCBCB" android:textColorHint="#CBCBCB"></EditText> android:textColor="#666666" android:textColorHint="#666666"></EditText> <TextView android:id="@+id/tv_count" BuWanVideo/res/layout/activity_main.xml
@@ -11,12 +11,14 @@ android:layout_width="match_parent" android:layout_height="48dp" android:background="@color/page_header_bg_color" android:gravity="center_vertical"> android:gravity="center_vertical" android:paddingTop="8dp" android:paddingBottom="8dp"> <LinearLayout android:id="@+id/ll_activity_main_search" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="8dp" android:layout_weight="2" android:background="@drawable/shape_search_bg" @@ -25,11 +27,10 @@ <ImageView android:id="@+id/iv_activity_main_search" android:layout_width="30dp" android:layout_height="30dp" android:layout_width="18dp" android:layout_height="18dp" android:layout_gravity="left|center_vertical" android:layout_marginLeft="8dp" android:padding="4dp" android:scaleType="fitCenter" android:src="@drawable/ic_activity_main_search"></ImageView> @@ -151,8 +152,8 @@ <ImageView android:id="@+id/iv_activity_main_download" android:layout_width="30dp" android:layout_height="30dp" android:layout_width="18dp" android:layout_height="18dp" android:layout_gravity="center" android:layout_margin="5dp" android:layout_toLeftOf="@id/iv_activity_main_search" BuWanVideo/res/layout/browser_fengxing_activity.xml
@@ -120,7 +120,7 @@ android:padding="9dp" android:text="刷新" android:textColor="#ff666666" android:textSize="15sp" /> android:textSize="14sp" /> <TextView android:id="@+id/tv_copy" @@ -131,7 +131,7 @@ android:padding="9dp" android:text="复制链接" android:textColor="#ff666666" android:textSize="15sp" /> android:textSize="14sp" /> <TextView android:id="@+id/tv_open" @@ -144,7 +144,7 @@ android:paddingBottom="9dp" android:text="用其他浏览器打开" android:textColor="#ff666666" android:textSize="15sp" /> android:textSize="14sp" /> </LinearLayout> BuWanVideo/res/layout/dialog_vip_new.xml
New file @@ -0,0 +1,84 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:background="@drawable/shape_new_dialog_vip_bg" android:gravity="center" android:orientation="vertical" android:padding="9dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="11dp" android:layout_marginBottom="20dp" android:text="购买详情" android:textColor="@color/vip_dialog_title_text_color" android:textSize="18sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@color/vip_dialog_cutline_bg_color"> </View> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingTop="20dp" android:paddingRight="5dp" android:paddingBottom="20dp"> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left|bottom" android:text="片名《流浪地球》" android:textColor="@color/vip_dialog_title_text_color" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|bottom" android:text="来源:PP视频" android:textColor="#999999" android:textSize="13sp" /> </FrameLayout> <LinearLayout android:id="@+id/ll_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/iv_close" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|top" android:src="@drawable/icon_vip_dialog_close_new"></ImageView> </FrameLayout> BuWanVideo/res/layout/dialog_vip_new_item.xml
New file @@ -0,0 +1,51 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="60dp" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/iv_icon" android:layout_width="25dp" android:layout_height="25dp" android:layout_marginLeft="16.5dp" android:layout_marginRight="6dp"></ImageView> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center_vertical" android:orientation="vertical"> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="VIP看高清 免广告" android:textSize="15sp" /> <TextView android:id="@+id/tv_subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="包月、季、年卡" android:textSize="11sp" /> </LinearLayout> <TextView android:id="@+id/tv_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="13.5dp" android:drawableRight="@drawable/icon_dialog_vip_new_item_input" android:drawablePadding="6.5dp" android:text="¥6~¥99" android:textSize="20sp" /> </LinearLayout> BuWanVideo/res/layout/fav_item.xml
@@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#5C5C5C" android:background="@color/page_content_bg_color" android:descendantFocusability="blocksDescendants" android:gravity="center_vertical" android:orientation="horizontal"> @@ -34,49 +35,77 @@ android:background="@android:color/transparent" /> </FrameLayout> <RelativeLayout <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:orientation="horizontal" android:padding="8dp"> <ImageView android:id="@+id/iv_cover" android:layout_width="100dp" android:layout_height="75dp" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:scaleType="centerCrop" /> <TextView android:id="@+id/tv_title" style="@style/TextGrayNormal" android:layout_width="wrap_content" <com.lcjian.library.widget.RatioLayout android:id="@+id/rl_picture" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignTop="@id/iv_cover" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="32dp" android:layout_marginRight="32dp" android:layout_toEndOf="@id/iv_cover" android:layout_toRightOf="@id/iv_cover" android:ellipsize="end" android:lines="2" android:textColor="@color/white" /> android:layout_weight="120" app:ratio="0.562"> <TextView android:id="@+id/tv_watch_time" style="@style/TextGrayNormal" android:layout_width="wrap_content" <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/iv_cover" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:scaleType="fitXY" /> </FrameLayout> </com.lcjian.library.widget.RatioLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignBottom="@id/iv_cover" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_toEndOf="@id/iv_cover" android:layout_toRightOf="@id/iv_cover" android:ellipsize="end" android:lines="1" android:textColor="@color/white" /> </RelativeLayout> android:layout_weight="170" android:orientation="vertical"> <TextView android:id="@+id/tv_title" style="@style/TextGrayNormal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/iv_cover" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="32dp" android:layout_marginRight="32dp" android:layout_toEndOf="@id/iv_cover" android:layout_toRightOf="@id/iv_cover" android:ellipsize="end" android:lines="2" android:textColor="@color/item_title_text_color" /> <TextView android:id="@+id/tv_watch_time" style="@style/TextGrayNormal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/iv_cover" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_toEndOf="@id/iv_cover" android:layout_toRightOf="@id/iv_cover" android:ellipsize="end" android:lines="1" android:textColor="@color/item_title_text_color" /> </LinearLayout> </LinearLayout> </LinearLayout> BuWanVideo/res/layout/item_album_list_ad.xml
@@ -18,6 +18,7 @@ <com.lcjian.library.widget.RatioLayout android:id="@+id/rl_picture" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="95" @@ -31,7 +32,7 @@ android:id="@+id/iv_picture" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop"></ImageView> android:scaleType="fitXY"></ImageView> </FrameLayout> BuWanVideo/res/layout/item_movie.xml
@@ -104,7 +104,7 @@ style="@style/TextBlackSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5.5dp" android:layout_marginTop="3dp" android:ellipsize="end" android:lines="1" android:paddingRight="8dp" BuWanVideo/res/layout/item_recommend_home_type.xml
@@ -21,14 +21,13 @@ android:layout_height="wrap_content" android:layout_marginLeft="4dp" android:paddingTop="8dp" android:gravity="center_vertical" android:paddingBottom="8dp"> <TextView android:id="@+id/tv_category_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@id/tv_category_icon" android:layout_weight="1" android:text="什么鬼" android:textColor="@color/item_title_text_color" @@ -39,9 +38,6 @@ android:id="@+id/tv_tag_refresh" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/shape_item_tag_bg" android:drawableLeft="@drawable/icon_item_refresh" android:drawablePadding="6.5dp" @@ -52,15 +48,12 @@ android:text="换一批" android:textColor="@color/item_tag_text_color" android:textSize="10sp" android:visibility="gone" /> android:visibility="visible" /> <TextView android:id="@+id/tv_more" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/shape_item_tag_bg" android:drawableRight="@drawable/ic_home_type_more" android:drawablePadding="6.5dp" BuWanVideo/res/layout/item_video_search_result_album.xml
@@ -34,6 +34,7 @@ android:drawablePadding="3.5dp" android:gravity="center" android:text="更多" android:textColor="#666666" android:textSize="12sp" /> @@ -45,6 +46,7 @@ <com.lcjian.library.widget.RatioLayout android:id="@+id/rl_picture" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="95" @@ -58,7 +60,7 @@ android:id="@+id/iv_picture" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop"></ImageView> android:scaleType="fitXY"></ImageView> <ImageView @@ -110,7 +112,7 @@ <TextView android:id="@+id/tv_score" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_height="20dp" android:layout_marginLeft="5dp" android:ellipsize="end" android:maxLines="2" BuWanVideo/res/layout/item_video_search_result_video.xml
@@ -9,9 +9,10 @@ <com.lcjian.library.widget.RatioLayout android:layout_width="0dp" android:id="@+id/rl_picture" android:layout_height="wrap_content" android:layout_weight="120" app:ratio="0.6667"> app:ratio="0.562"> <FrameLayout android:layout_width="match_parent" @@ -23,7 +24,7 @@ android:layout_height="match_parent" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:scaleType="centerCrop" /> android:scaleType="fitXY" /> <ImageView android:id="@+id/iv_vip" BuWanVideo/res/layout/mine_fragment.xml
@@ -33,7 +33,7 @@ android:background="@drawable/ic_mine_bg_white" android:orientation="vertical" android:paddingTop="40dp" android:paddingBottom="20dp"> android:paddingBottom="8.5dp"> <LinearLayout android:id="@+id/mine_rl_head" @@ -121,6 +121,9 @@ android:layout_height="wrap_content" android:layout_marginLeft="12dp" android:layout_marginRight="12dp" android:paddingTop="12dp" android:paddingBottom="12dp" android:background="@drawable/shape_mine_functions_bg" android:orientation="horizontal"> @@ -241,7 +244,10 @@ android:id="@+id/ll_vip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="12dp" android:layout_marginTop="0dp" android:layout_marginLeft="12dp" android:layout_marginRight="12dp" android:background="@drawable/shape_vip_bg" android:gravity="center_vertical" android:orientation="horizontal" BuWanVideo/res/layout/mvideo_activity.xml
@@ -51,8 +51,8 @@ <ImageView android:id="@+id/iv_recommend_watch_history" android:layout_width="25dp" android:layout_height="25dp" android:layout_width="18dp" android:layout_height="18dp" android:layout_gravity="center" android:layout_margin="8dp" android:scaleType="fitCenter" @@ -68,8 +68,8 @@ <ImageView android:id="@+id/iv_activity_main_search" android:layout_width="25dp" android:layout_height="25dp" android:layout_width="18dp" android:layout_height="18dp" android:layout_gravity="center" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" BuWanVideo/res/layout/search_actvity.xml
@@ -28,11 +28,10 @@ <ImageView android:id="@+id/iv_activity_main_search" android:layout_width="30dp" android:layout_height="30dp" android:layout_width="18dp" android:layout_height="18dp" android:layout_gravity="left|center_vertical" android:layout_marginLeft="11dp" android:padding="4dp" android:scaleType="fitCenter" android:src="@drawable/ic_activity_main_search"></ImageView> BuWanVideo/res/layout/search_result_activity.xml
@@ -26,11 +26,10 @@ <ImageView android:id="@+id/iv_activity_main_search" android:layout_width="30dp" android:layout_height="30dp" android:layout_width="18dp" android:layout_height="18dp" android:layout_gravity="left|center_vertical" android:layout_marginLeft="11dp" android:padding="4dp" android:scaleType="fitCenter" android:src="@drawable/ic_activity_main_search"></ImageView> @@ -90,6 +89,7 @@ android:layout_height="wrap_content" android:background="@color/page_content_bg_color" android:paddingLeft="10dp" android:paddingTop="10dp" android:paddingRight="10dp"></android.support.v7.widget.RecyclerView> </com.weikou.beibeivideo.widget.MySwipeRefreshLayout> @@ -111,7 +111,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="抱歉,暂未搜索到相关内容..." android:text="抱歉,暂未搜索到相关内容" android:textColor="@color/list_empty_default_text_color"></TextView> BuWanVideo/res/layout/search_result_top_bar.xml
@@ -5,8 +5,7 @@ android:background="@color/page_content_bg_color" android:orientation="horizontal" android:paddingLeft="8dp" android:paddingRight="8dp" android:paddingBottom="12dp"> android:paddingRight="8dp"> <HorizontalScrollView android:layout_width="match_parent" BuWanVideo/res/layout/watch_history_item.xml
@@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/page_content_bg_color" @@ -34,78 +35,68 @@ android:background="@android:color/transparent" /> </FrameLayout> <RelativeLayout <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" android:orientation="horizontal" android:padding="8dp" android:tag="front"> <ImageView android:id="@+id/iv_cover" android:layout_width="100dp" android:layout_height="63dp" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:scaleType="centerCrop" /> <TextView android:id="@+id/tv_title" style="@style/TextGrayNormal" android:layout_width="wrap_content" <com.lcjian.library.widget.RatioLayout android:id="@+id/rl_picture" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignTop="@id/iv_cover" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_toEndOf="@id/iv_cover" android:layout_toRightOf="@id/iv_cover" android:ellipsize="end" android:maxLines="1" android:textColor="@color/item_title_text_color" /> android:layout_weight="120" app:ratio="0.562"> <TextView android:id="@+id/tv_watch_time" style="@style/TextGrayNormal" android:layout_width="wrap_content" <ImageView android:id="@+id/iv_cover" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:scaleType="fitXY" /> </com.lcjian.library.widget.RatioLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignBottom="@id/iv_cover" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_toEndOf="@id/iv_cover" android:layout_toRightOf="@id/iv_cover" android:ellipsize="end" android:maxLines="1" android:textColor="@color/item_title_text_color" /> android:layout_weight="170" android:orientation="vertical"> <!-- <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" > <TextView android:id="@+id/tv_title" style="@style/TextGrayNormal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" android:layout_toEndOf="@id/iv_cover" android:layout_toRightOf="@id/iv_cover" android:ellipsize="end" android:maxLines="1" android:textColor="@color/item_title_text_color" /> <CheckBox android:id="@+id/chb_watch_history" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@null" android:button="@null" android:drawableLeft="@drawable/selector_checkbox" android:drawableStart="@drawable/selector_checkbox" /> <ImageButton android:id="@+id/btn_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@android:color/transparent" /> </FrameLayout> --> </RelativeLayout> <TextView android:id="@+id/tv_watch_time" style="@style/TextGrayNormal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:ellipsize="end" android:maxLines="1" android:textColor="@color/item_title_text_color" /> </LinearLayout> </LinearLayout> </LinearLayout> BuWanVideo/res/values/colors.xml
@@ -103,7 +103,7 @@ <!--视频颜色 --> <color name="video_list_title_text_color">#000000</color> <color name="video_list_subtitle_text_color">#9FA5B3</color> <color name="video_list_tag_text_color">#C0C0C0</color> <color name="video_list_tag_text_color">#ffffff</color> <color name="video_list_score_text_color">#f8dc9f</color> <color name="video_episode_text_color">#232323</color> <color name="video_episode_bg_color">#EFEFEF</color> @@ -147,5 +147,12 @@ <color name="video_list_nav_text_color">#717481</color> <color name="video_list_nav_bg_color">#FFFFFF</color> <color name="common_bg_color">#E8E8E8</color> <color name="vip_dialog_bg_color">#FFFFFF</color> <color name="vip_dialog_title_text_color">#010101</color> <color name="vip_dialog_mark_text_color">#999999</color> <color name="vip_dialog_cutline_bg_color">#CDCDCD</color> </resources> BuWanVideo/src/com/weikou/beibeivideo/BeibeiVideoAPI.java
@@ -1333,6 +1333,29 @@ } /** * 付费视频的购买活动 * * @param context * @param cid * @param vid * @param handler */ public static void getPPTVVIPVideoActivity(Context context, String url, String cid, String vid, ResponseHandlerInterface handler) { String loginUid = UserUtil.getLoginUid(context); LinkedHashMap<String, String> params = new LinkedHashMap<>(); if (loginUid != null) params.put("loginUid", loginUid); if (url != null) { params.put("url", url); } params.put("cid", cid); params.put("vid", vid); commonPost(context, BASE_URL + "video/play/getPPTVVIPVideoActivity", params, handler); } public static LinkedHashMap<String, String> validateParams( LinkedHashMap<String, String> params, Context context) { params.put("System", "1"); BuWanVideo/src/com/weikou/beibeivideo/BeibeiVideoApplication.java
@@ -306,16 +306,22 @@ ComponentName cn = am.getRunningTasks(1).get(0).topActivity; if (!cn.getClassName().equalsIgnoreCase(SplashActivity.class.getName())) { Log.i(TAG, "应当展示开屏广告"); //小于30分钟不展示 if (System.currentTimeMillis() - SplashADFragment.lastShowTime < 1000 * 60 * 30L) return; // 测试 // if (System.currentTimeMillis() - SplashADFragment.lastShowTime < 1000 * 60 * 30L) // return; if (SplashADFragment.isAdLoaded()) { startActivity(new Intent(getApplicationContext(), SplashAdActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); return; } AdUtil.AD_TYPE type1 = AdUtil.getAdType(getApplicationContext(), AdPositionEnum.splashHotStart); AdUtil.AD_TYPE type1 =AdUtil.getAdType(getApplicationContext(), AdPositionEnum.splashHotStart); String pid1 = AdUtil.getAdPid(getApplicationContext(), AdPositionEnum.splashHotStart); AdPidInfo adPidInfo1 = null; AdPidInfo adPidInfo2 = null; if (type1 != null) { BuWanVideo/src/com/weikou/beibeivideo/entity/VideoInfo.java
@@ -401,7 +401,7 @@ this.director = director; } public static class VideoAlbumMoreInfo { public static class VideoAlbumMoreInfo implements Serializable{ private String name; private int jumpPosition; BuWanVideo/src/com/weikou/beibeivideo/entity/vo/PPTVVideoActivityInfoVO.java
New file @@ -0,0 +1,25 @@ package com.weikou.beibeivideo.entity.vo; import java.util.List; public class PPTVVideoActivityInfoVO { private List<PPTVWatchVIPVideoActivityWay> wayList; private String videoName; public List<PPTVWatchVIPVideoActivityWay> getWayList() { return wayList; } public void setWayList(List<PPTVWatchVIPVideoActivityWay> wayList) { this.wayList = wayList; } public String getVideoName() { return videoName; } public void setVideoName(String videoName) { this.videoName = videoName; } } BuWanVideo/src/com/weikou/beibeivideo/entity/vo/PPTVWatchVIPVideoActivityWay.java
New file @@ -0,0 +1,112 @@ package com.weikou.beibeivideo.entity.vo; import com.weikou.beibeivideo.entity.JumpDetail; /** * 观看VIP视频的活动 */ public class PPTVWatchVIPVideoActivityWay { private String title; private String subTitle; private String icon; private String textColor; private String startBgColor; private String endBgColor; private String startPrice; private String endPrice; private String type; //跳转相关参数 private JumpDetail jumpDetail; private String params; public String getType() { return type; } public void setType(String type) { this.type = type; } public JumpDetail getJumpDetail() { return jumpDetail; } public void setJumpDetail(JumpDetail jumpDetail) { this.jumpDetail = jumpDetail; } public String getParams() { return params; } public void setParams(String params) { this.params = params; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSubTitle() { return subTitle; } public void setSubTitle(String subTitle) { this.subTitle = subTitle; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public String getTextColor() { return textColor; } public void setTextColor(String textColor) { this.textColor = textColor; } public String getStartBgColor() { return startBgColor; } public void setStartBgColor(String startBgColor) { this.startBgColor = startBgColor; } public String getEndBgColor() { return endBgColor; } public void setEndBgColor(String endBgColor) { this.endBgColor = endBgColor; } public String getStartPrice() { return startPrice; } public void setStartPrice(String startPrice) { this.startPrice = startPrice; } public String getEndPrice() { return endPrice; } public void setEndPrice(String endPrice) { this.endPrice = endPrice; } } BuWanVideo/src/com/weikou/beibeivideo/ui/BaseActivity.java
@@ -77,7 +77,7 @@ // if (res.getConfiguration().fontScale != 1) {//非默认值 Configuration newConfig = new Configuration(); newConfig.setToDefaults();//设置默认 newConfig.fontScale = 1.0f; newConfig.fontScale = 1.1f; res.updateConfiguration(newConfig, res.getDisplayMetrics()); // } return res; BuWanVideo/src/com/weikou/beibeivideo/ui/ad/SplashADFragment.java
@@ -109,7 +109,7 @@ private Timer timer; private int leftTime = 5; public boolean showAd() { public boolean showAd(boolean vclick) { if (isAdLoaded()) { //穿山甲广告 if (adLoadInfo.getCsjAd() != null) { @@ -159,8 +159,14 @@ public void run() { if (ad_close_time != null) ad_close_time.setVisibility(View.GONE); if (ll_input != null) ll_input.setClickable(true); if (vclick) { if (ll_input != null) ll_input.setClickable(true); } else { if (mAdShowListener != null) mAdShowListener.onClose(); } } }); @@ -176,7 +182,9 @@ ad_close_time.setText(leftTime + ""); } }); ll_input.setClickable(false); if (vclick) { ll_input.setClickable(false); } } } }, 1000, 1000); @@ -226,7 +234,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View root = LayoutInflater.from(getContext()).inflate(R.layout.fragment_splash_ad, null); initView(root); if (!showAd()) { if (!showAd(Math.random() < 0.1f ? true : false)) { Bundle arguments = getArguments(); AdPidInfo adPidInfo1 = null; AdPidInfo adPidInfo2 = null; @@ -239,7 +247,7 @@ @Override public void onAdLoad(SplashAdLoadInfo adLoadInfo) { showAd(); showAd(false); } @Override BuWanVideo/src/com/weikou/beibeivideo/ui/common/ListVideoAdapter.java
@@ -15,7 +15,10 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; import com.bumptech.glide.request.RequestOptions; import com.lcjian.library.util.common.StringUtils; import com.lcjian.library.util.glide.GlideRoundTransform; import com.lcjian.library.widget.RatioLayout; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; @@ -98,6 +101,10 @@ .findViewById(R.id.tv_title); viewHolder.tv_movie_rating = (TextView) convertView .findViewById(R.id.tv_watch_time); viewHolder.rl_picture = convertView .findViewById(R.id.rl_picture); viewHolder.fl_video_select = (FrameLayout) convertView .findViewById(R.id.fl_video_select); viewHolder.chb_delete = (CheckBox) convertView @@ -114,14 +121,22 @@ final String thirdtype = videoInfo.getThirdType(); // imageLoader.displayImage(videoInfo.getPicture(), // viewHolder.iv_movie_cover);// GridVideoAdapter try { glide.load(videoInfo.getPicture()) .placeholder(R.drawable.ic_default_cover) .error(R.drawable.ic_default_cover) .into(viewHolder.iv_movie_cover); } catch (IllegalArgumentException e) { e.printStackTrace(); } viewHolder.rl_picture.setTag(videoInfo.getPicture()); viewHolder.rl_picture.post(new Runnable() { @Override public void run() { try { glide.load(viewHolder.rl_picture.getTag() + "").apply(new RequestOptions().centerCrop()) .transform(new GlideRoundTransform(context, 6)) .placeholder(R.drawable.shape_video_list_cover_placeholder) .error(R.drawable.shape_video_list_cover_placeholder) .into(viewHolder.iv_movie_cover); } catch (IllegalArgumentException e) { e.printStackTrace(); } } }); viewHolder.tv_movie_title.setText(videoInfo.getName()); viewHolder.tv_movie_rating.setText(StringUtils.isBlank(videoInfo .getTag()) ? "" : videoInfo.getTag()); @@ -185,6 +200,7 @@ ImageView iv_movie_cover; TextView tv_movie_title; TextView tv_movie_rating; RatioLayout rl_picture; private FrameLayout fl_video_select; private CheckBox chb_delete; BuWanVideo/src/com/weikou/beibeivideo/ui/dialog/VIPNewDialog.java
New file @@ -0,0 +1,178 @@ package com.weikou.beibeivideo.ui.dialog; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; import android.text.SpannableString; import android.text.Spanned; import android.text.style.AbsoluteSizeSpan; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.alibaba.fastjson.JSONObject; import com.androidquery.AQuery; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.entity.vo.PPTVWatchVIPVideoActivityWay; import com.weikou.beibeivideo.util.DimenUtils; import com.weikou.beibeivideo.util.JumpActivityUtil; import com.weikou.beibeivideo.util.downutil.StringUtils; import java.util.List; /** * vip弹框 */ public class VIPNewDialog extends Dialog { private static String TAG = VIPNewDialog.class.getName(); public VIPNewDialog(Context context) { super(context); this.setCancelable(false); } public VIPNewDialog(Context context, int theme) { super(context, theme); this.setCancelable(false); } public static class Builder { private Activity context; public Builder(Activity context) { this.context = context; } private View.OnClickListener closeListener; private ItemClickListener itemClickListener; private List<PPTVWatchVIPVideoActivityWay> activityList; private String videoName; public Builder setCloseListener(View.OnClickListener listener) { this.closeListener = listener; return this; } public Builder setItemClickListener(ItemClickListener listener) { this.itemClickListener = listener; return this; } public Builder setActivityData(List<PPTVWatchVIPVideoActivityWay> activityList, String videoName) { this.activityList = activityList; this.videoName = videoName; return this; } public VIPNewDialog create() { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); final VIPNewDialog dialog = new VIPNewDialog(context, R.style.Dialog); dialog.setCanceledOnTouchOutside(true); final View layout = inflater.inflate(R.layout.dialog_vip_new, null); ImageView iv_close = layout.findViewById(R.id.iv_close); TextView tv_name = layout.findViewById(R.id.tv_name); SpannableString spannableString = new SpannableString("片名" + videoName); spannableString.setSpan(new AbsoluteSizeSpan(com.lcjian.library.util.common.DimenUtils.spToPixels(12, context)), 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); tv_name.setText(spannableString); LinearLayout ll_container = layout.findViewById(R.id.ll_container); for (PPTVWatchVIPVideoActivityWay vo : activityList) { addItem(ll_container, vo, inflater, context); } iv_close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (closeListener != null) closeListener.onClick(v); } }); dialog.setContentView(layout); WindowManager.LayoutParams params = dialog.getWindow() .getAttributes(); params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; dialog.getWindow().setAttributes(params); dialog.getWindow().setGravity(Gravity.BOTTOM); return dialog; } private void addItem(LinearLayout ll_container, PPTVWatchVIPVideoActivityWay vo, LayoutInflater inflater, Activity context) { View view = inflater.inflate(R.layout.dialog_vip_new_item, null); AQuery mAquery = new AQuery(view); mAquery.id(R.id.tv_title).text(vo.getTitle()); mAquery.id(R.id.tv_subtitle).text(vo.getSubTitle()); String price = ""; if (!StringUtils.isNullOrEmpty(vo.getStartPrice())) { price += "¥" + vo.getStartPrice(); } if (!StringUtils.isNullOrEmpty(vo.getEndPrice())) { price += "~¥" + vo.getEndPrice(); } if (price.length() > 0) { SpannableString priceString = new SpannableString(price); for (int i = 0; i < price.length(); i++) { if ((price.charAt(i) + "").equals("¥")) { priceString.setSpan(new AbsoluteSizeSpan(com.lcjian.library.util.common.DimenUtils.spToPixels(10, context)), i, i + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } } mAquery.id(R.id.tv_price).text(priceString); } mAquery.id(R.id.tv_title).textColor(Color.parseColor(vo.getTextColor())); mAquery.id(R.id.tv_subtitle).textColor(Color.parseColor(vo.getTextColor())); mAquery.id(R.id.tv_price).textColor(Color.parseColor(vo.getTextColor())); mAquery.id(R.id.iv_icon).image(vo.getIcon()); GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, new int[]{Color.parseColor(vo.getStartBgColor()), Color.parseColor(vo.getEndBgColor())}); gd.setCornerRadius(DimenUtils.dip2px(context, 6)); view.setBackground(gd); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, DimenUtils.dip2px(context, 60)); lp.setMargins(0, 0, 0, DimenUtils.dip2px(context, 10)); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (itemClickListener != null) itemClickListener.onClick(vo); } }); ll_container.addView(view, lp); } } public interface MeasureCallBack { public void onMeasure(int height); } public interface ItemClickListener { public void onClick(PPTVWatchVIPVideoActivityWay way); } } BuWanVideo/src/com/weikou/beibeivideo/ui/main/MineFragment.java
@@ -49,6 +49,7 @@ import com.weikou.beibeivideo.ui.mine.SystemMessageActivity; import com.weikou.beibeivideo.ui.mine.WatchHistoryActivity; import com.weikou.beibeivideo.ui.recommend.SearchActivity; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.ConfigUtil; import com.weikou.beibeivideo.util.UserUtil; import com.weikou.beibeivideo.widget.BadgeView; @@ -270,8 +271,8 @@ break; case R.id.rl_mine_about_us: Intent intent1 = new Intent(getContext(), BrowserActivity.class); // intent1.putExtra("url", BeibeiConstant.ABOUT_US); intent1.putExtra("url", "https://www.iqiyi.com/v_fuudooxv8k.html"); intent1.putExtra("url", BeibeiConstant.ABOUT_US); // intent1.putExtra("url", "https://www.iqiyi.com/v_fuudooxv8k.html"); startActivity(intent1); break; case R.id.rl_mine_settings: BuWanVideo/src/com/weikou/beibeivideo/ui/media/EpisodeFragment.java
@@ -713,7 +713,6 @@ com.weikou.beibeivideo.util.DimenUtils.dip2px(getContext(), 120), android.view.WindowManager.LayoutParams.WRAP_CONTENT); popupWindow.setOutsideTouchable(true);// 点击外部可点击 popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.shape_video_detail_resource_bg)); popupWindow.setAnimationStyle(R.style.PopupAnimation); popupWindow.setFocusable(true);// 获取焦点 @@ -804,6 +803,22 @@ } else { tv.setText(reList.get(position).getName()); } int background = 0; if (reList.size() <= 1) { background = reList.get(position).isChecked() ? R.drawable.shape_video_detail_resource_single_item_selected_bg : R.drawable.shape_video_detail_resource_single_item_bg; } else { if (position == 0) { background = reList.get(position).isChecked() ? R.drawable.shape_video_detail_resource_top_item_selected_bg : R.drawable.shape_video_detail_resource_top_item_bg; } else if (position == reList.size() - 1) { background = reList.get(position).isChecked() ? R.drawable.shape_video_detail_resource_bottom_item_selected_bg : R.drawable.shape_video_detail_resource_bottom_item_bg; } else { background = reList.get(position).isChecked() ? R.drawable.shape_video_detail_resource_middle_item_selected_bg : R.drawable.shape_video_detail_resource_middle_item_bg; } } view.setBackgroundResource(background); return view; } } BuWanVideo/src/com/weikou/beibeivideo/ui/mine/PPTVPlayFragment.java
@@ -6,7 +6,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.graphics.Color; import android.net.Uri; import android.net.http.SslError; import android.os.Build; @@ -22,7 +21,6 @@ import android.webkit.ConsoleMessage; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -33,6 +31,7 @@ import android.widget.Toast; import com.androidquery.AQuery; import com.google.gson.Gson; import com.lcjian.library.RetainViewFragment; import com.lcjian.library.dialog.DialogUtil; import com.lcjian.library.util.SingleToast; @@ -46,16 +45,17 @@ import com.weikou.beibeivideo.entity.ad.AdPositionEnum; import com.weikou.beibeivideo.entity.ad.PlayVideoPreADSetting; import com.weikou.beibeivideo.entity.ad.RewardVideoAdContainer; import com.weikou.beibeivideo.entity.vo.PPTVVideoActivityInfoVO; import com.weikou.beibeivideo.entity.vo.PPTVWatchVIPVideoActivityWay; import com.weikou.beibeivideo.ui.ad.PlayVideoPreADFragment; import com.weikou.beibeivideo.ui.dialog.JumpVideoLoadingDialog; import com.weikou.beibeivideo.ui.dialog.LoadingDialogUtil; import com.weikou.beibeivideo.ui.dialog.VIPDialog; import com.weikou.beibeivideo.ui.dialog.VIPNewDialog; import com.weikou.beibeivideo.ui.login.LoginActivity; import com.weikou.beibeivideo.ui.main.MainActivity; import com.weikou.beibeivideo.ui.video.VideoPlayerBrowserActivity; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.ConfigUtil; import com.weikou.beibeivideo.util.DimenUtils; import com.weikou.beibeivideo.util.JumpActivityUtil; import com.weikou.beibeivideo.util.UmengEventUtil; import com.weikou.beibeivideo.util.UserUtil; import com.weikou.beibeivideo.util.ad.AdUtil; @@ -69,7 +69,9 @@ import org.apache.http.Header; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PPTVPlayFragment extends RetainViewFragment implements OnClickListener { @@ -99,7 +101,7 @@ private AQuery query; private void getPPVideoInfo(String url) { private String[] getPPVideoInfo(String url) { if (url.contains("cid=") && url.contains("vid=")) { String[] sts = url.split("\\?"); if (sts.length > 1) { @@ -107,20 +109,17 @@ String[] ps = params.split("&"); Map<String, String> map = new HashMap<>(); for (String p : ps) { map.put(p.split("=")[0], p.split("=")[1]); map.put(p.split("=")[0], p.split("=").length > 1 ? p.split("=")[1] : ""); } String cid = map.get("cid"); String vid = map.get("vid"); //PPTV播放上传 BeibeiVideoAPI.uploadPPTVPlayRecord(getContext(), cid, vid, new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { } }); return new String[]{cid, vid}; } } return null; } private void initWebView(View view) { @@ -135,7 +134,16 @@ } try { getPPVideoInfo(url); String[] cvid = getPPVideoInfo(url); if (cvid != null && cvid.length > 1) { //PPTV播放上传 BeibeiVideoAPI.uploadPPTVPlayRecord(getContext(), cvid[0], cvid[1], new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { } }); } } catch (Exception e) { } @@ -177,7 +185,7 @@ public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); tv_url.setText(view.getUrl()); tv_title.setText(title); // tv_title.setText(title); } /** @@ -252,8 +260,9 @@ @Override public void run() { getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); if (vipDialog != null && !vipDialog.isShowing()) vipDialog.show(); // if (vipDialog != null && !vipDialog.isShowing()) // vipDialog.show(); getActivityInfo(tv_url.getText() + ""); } }); @@ -315,6 +324,62 @@ } } private VIPNewDialog vipNewDialog; private synchronized void getActivityInfo(String url) { String cid = ""; String vid = ""; try { String[] cvids = getPPVideoInfo(url); if (cvids != null && cvids.length > 1) { cid = cvids[0]; vid = cvids[1]; } } catch (Exception e) { } DialogUtil.dismiss(vipNewDialog); BeibeiVideoAPI.getPPTVVIPVideoActivity(getContext(), url, cid, vid, new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { if (jsonObject.optBoolean("IsPost")) { JSONObject data = jsonObject.optJSONObject("Data"); PPTVVideoActivityInfoVO vo = new Gson().fromJson(data.toString(), PPTVVideoActivityInfoVO.class); vipNewDialog = new VIPNewDialog.Builder(getActivity()).setActivityData(vo.getWayList(), vo.getVideoName()).setCloseListener(new OnClickListener() { @Override public void onClick(View v) { DialogUtil.dismiss(vipNewDialog); } }).setItemClickListener(new VIPNewDialog.ItemClickListener() { @Override public void onClick(PPTVWatchVIPVideoActivityWay way) { DialogUtil.dismiss(vipNewDialog); if ("vip".equalsIgnoreCase(way.getType())) { jumpToVIP(); } else { if (way.getJumpDetail() != null) JumpActivityUtil.jumpPage(getActivity(), way.getJumpDetail(), way.getParams() != null ? com.alibaba.fastjson.JSONObject.parseObject(way.getParams().replace( "\\" + "\"", "\"")) : null); } } }).create(); DialogUtil.show(vipNewDialog); } } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { super.onFailure(statusCode, headers, responseString, throwable); Toast.makeText(getContext(), "网络请求出错", Toast.LENGTH_SHORT).show(); } }); } private void initView(View view) { loadingDialog = LoadingDialogUtil.getLoadingDialog(getContext(), ""); BuWanVideo/src/com/weikou/beibeivideo/ui/recent/WatchHistoryAdapter.java
@@ -15,7 +15,10 @@ import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.lcjian.library.util.common.StringUtils; import com.lcjian.library.util.glide.GlideRoundTransform; import com.lcjian.library.widget.RatioLayout; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.entity.VideoInfo; import com.weikou.beibeivideo.entity.vo.WatchHistoryVO; @@ -65,13 +68,19 @@ if (StringUtils.isEmpty(videoInfo.getPicture())) videoInfo.setPicture(""); try { Glide.with(context).load(videoInfo.getPicture()) .placeholder(R.drawable.ic_default_cover) .error(R.drawable.ic_default_cover).into(viewHolder.iv_cover); } catch (IllegalArgumentException e) { e.printStackTrace(); } viewHolder.rl_picture.setTag(videoInfo.getPicture()); viewHolder.rl_picture.post(new Runnable() { @Override public void run() { try { Glide.with(context).load(viewHolder.rl_picture.getTag() + "").apply(new RequestOptions().centerCrop()).transform(new GlideRoundTransform(context, 6)) .placeholder(R.drawable.shape_video_list_cover_placeholder).into(viewHolder.iv_cover); } catch (IllegalArgumentException e) { e.printStackTrace(); } } }); } private void getVideoDetail(WatchHistoryVO vo, @@ -115,6 +124,8 @@ holder.chb_delete = (CheckBox) view.findViewById(R.id.chb_delete); holder.fl_video_select = (FrameLayout) view .findViewById(R.id.fl_video_select); holder.rl_picture = view .findViewById(R.id.rl_picture); view.setTag(holder); } @@ -179,7 +190,6 @@ }); holder.chb_delete.setChecked(mSelectedIds.contains(vo.getId())); } holder.iv_cover.setImageResource(R.drawable.ic_default_cover); holder.tv_title.setText(""); getVideoDetail(vo, holder); @@ -195,6 +205,7 @@ ImageButton btn_delete; CheckBox chb_delete; FrameLayout fl_video_select; RatioLayout rl_picture; } public Set<String> getSelectedIds() { BuWanVideo/src/com/weikou/beibeivideo/ui/recommend/RecommendFragment.java
@@ -24,6 +24,7 @@ import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.annotations.Expose; import com.google.gson.reflect.TypeToken; import com.lcjian.library.RetainViewFragment; import com.lcjian.library.content.ConnectivityChangeHelper; @@ -704,6 +705,13 @@ type.setParams(obj.optString("Params")); type.setIcon(obj.optString("Icon")); type.setNeedAd(obj.optBoolean("NeedAd", false)); type.setRefreshPosition(obj.optInt("RefreshPosition", 0)); type.setMoreTag(obj.optString("MoreTag")); type.setCount(obj.optInt("Count")); type.setNumber(obj.optInt("Number")); type.setCurrentPage(1); if (obj.optJSONObject("Ad") != null) type.setAd(gson.fromJson(obj.optJSONObject("Ad").toString(), HomeType.HomeTypeAd.class)); @@ -716,10 +724,6 @@ homeList.add(gson.fromJson(homeArray .optJSONObject(j).toString(), HomeVideo.class)); //TODO 测试 if (i == 1 && j == 0) { homeList.get(0).setBigPicture(true); } } } BuWanVideo/src/com/weikou/beibeivideo/ui/recommend/RecommendNewAdapter.java
@@ -26,7 +26,6 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.lcjian.library.util.common.DimenUtils; import com.lcjian.library.util.common.StringUtils; import com.lcjian.library.widget.RatioLayout; import com.weikou.beibeivideo.BasicTextHttpResponseHandler; import com.weikou.beibeivideo.BeibeiVideoAPI; @@ -49,6 +48,7 @@ import com.weikou.beibeivideo.util.VideoUtil; import com.weikou.beibeivideo.util.ad.AdUtil; import com.weikou.beibeivideo.util.ad.ExpressAdManager; import com.weikou.beibeivideo.util.downutil.StringUtils; import com.weikou.beibeivideo.util.video.VideoUIUtil; import org.apache.http.Header; @@ -259,7 +259,7 @@ //更多 if (Boolean.parseBoolean(homeType.getHasMore())) { holder.tv_more.setVisibility(View.VISIBLE); if (!StringUtils.isEmpty(homeType.getMoreTag())) { if (!StringUtils.isNullOrEmpty(homeType.getMoreTag())) { holder.tv_more.setText(homeType.getMoreTag()); } else { holder.tv_more.setText("更多" + homeType.getName()); BuWanVideo/src/com/weikou/beibeivideo/ui/recommend/SearchResultActivity.java
@@ -202,7 +202,7 @@ rv_video_search.setLayoutManager(new MyLinearLayoutManager(getApplicationContext())); DividerItemDecoration decoration = new DividerItemDecoration(); decoration.setSize(DimenUtils.dip2px(rv_video_search.getContext(), 6)); decoration.setSize(DimenUtils.dip2px(rv_video_search.getContext(), 15)); rv_video_search.addItemDecoration(decoration); adapter = new SearchResultAdapter(this, mVideoInfos, new SearchResultAdapter.VideoAlbumNavClickListener() { @@ -306,13 +306,13 @@ private void setTopBarSelect(TextView tv_name, boolean selected) { if (selected) { tv_name.setBackgroundResource(R.drawable.vpi__tab_selected_focused_holo); tv_name.setTextSize(17); tv_name.setTextSize(19); tv_name.setTextColor(getResources().getColor(R.color.search_nav_highlight_text_color)); tv_name.setPadding(0, 0, 0, DimenUtils.dip2px(getApplicationContext(), 5)); tv_name.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); } else { tv_name.setBackground(null); tv_name.setTextSize(12); tv_name.setTextSize(14); tv_name.setTextColor(getResources().getColor(R.color.nav_text_color)); tv_name.setPadding(0, 0, 0, 0); tv_name.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); BuWanVideo/src/com/weikou/beibeivideo/ui/video/SearchResultAdapter.java
@@ -21,8 +21,11 @@ import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.lcjian.library.util.common.DimenUtils; import com.lcjian.library.util.common.StringUtils; import com.lcjian.library.util.glide.GlideRoundTransform; import com.lcjian.library.widget.RatioLayout; import com.qq.e.ads.nativ.NativeADEventListener; import com.qq.e.ads.nativ.NativeUnifiedADData; import com.qq.e.ads.nativ.widget.NativeAdContainer; @@ -121,7 +124,20 @@ if (StringUtils.isBlank(pic)) pic = info.getPicture(); Glide.with(mContext).load(pic).transition(withCrossFade()).placeholder(R.color.black).into(albumVideoHolder.iv_picture); albumVideoHolder.rl_picture.setTag(pic); albumVideoHolder.rl_picture.post(new Runnable() { @Override public void run() { try { Glide.with(mContext).load(albumVideoHolder.rl_picture.getTag() + "").apply(new RequestOptions().centerCrop()).transition(withCrossFade()).transform(new GlideRoundTransform(mContext, 6)).placeholder(R.drawable.shape_video_list_cover_placeholder).into(albumVideoHolder.iv_picture); } catch (IllegalArgumentException e) { e.printStackTrace(); } } }); } catch (IllegalArgumentException e) { e.printStackTrace(); } @@ -177,7 +193,7 @@ //设置分数 if (!StringUtils.isEmpty(videoContent.getVideo().getScore())) { albumVideoHolder.tv_score.setVisibility(View.VISIBLE); String st = "评分:" + videoContent.getVideo().getScore(); String st = "评分:" + videoContent.getVideo().getScore()+" "; SpannableString spannableString = new SpannableString(st); spannableString.setSpan(new AbsoluteSizeSpan(DimenUtils.spToPixels(13, mContext)), 3, st.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FF9C00")), 3, st.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); @@ -270,11 +286,18 @@ } else if (holder instanceof SimpleVideoHolder) { final VideoInfo info = videoContent.getVideo(); SimpleVideoHolder simpleVideoHolder = (SimpleVideoHolder) holder; try { Glide.with(mContext).load(info.getPicture()).transition(withCrossFade()).placeholder(R.color.black).into(simpleVideoHolder.iv_movie_cover); } catch (IllegalArgumentException e) { e.printStackTrace(); } simpleVideoHolder.rl_picture.setTag(info.getPicture()); simpleVideoHolder.rl_picture.post(new Runnable() { @Override public void run() { try { Glide.with(mContext).load(simpleVideoHolder.rl_picture.getTag() + "").apply(new RequestOptions().centerCrop()).transition(withCrossFade()).transform(new GlideRoundTransform(mContext, 6)).placeholder(R.drawable.shape_video_list_cover_placeholder).into(simpleVideoHolder.iv_movie_cover); } catch (IllegalArgumentException e) { e.printStackTrace(); } } }); simpleVideoHolder.tv_movie_title.setText(info.getName() + ""); if (info.getFree() == 1) { @@ -301,7 +324,19 @@ if (videoContent.getAd().getGdt2Unfied() != null) { NativeUnifiedADData ad = videoContent.getAd().getGdt2Unfied(); Glide.with(mContext).load(ad.getImgUrl()).transition(withCrossFade()).placeholder(R.drawable.shape_video_list_cover_placeholder).into(viewHolder.iv_picture); viewHolder.rl_picture.setTag(ad.getImgUrl()); viewHolder.rl_picture.post(new Runnable() { @Override public void run() { try { Glide.with(mContext).load(viewHolder.rl_picture.getTag() + "").apply(new RequestOptions().centerCrop()).transition(withCrossFade()).transform(new GlideRoundTransform(mContext, 6)).placeholder(R.drawable.shape_video_list_cover_placeholder).into(viewHolder.iv_picture); } catch (IllegalArgumentException e) { e.printStackTrace(); } } }); viewHolder.tv_name.setText(ad.getTitle()); viewHolder.tv_actors.setText(ad.getDesc()); @@ -411,6 +446,7 @@ TextView tv_play; View view; NativeAdContainer mNativeAdContainer; RatioLayout rl_picture; public VideoAdHolder(View view) { super(view); @@ -422,7 +458,7 @@ tv_actors = view.findViewById(R.id.tv_actors); tv_play = view.findViewById(R.id.tv_play); mNativeAdContainer = view.findViewById(R.id.root); rl_picture = view.findViewById(R.id.rl_picture); } } @@ -444,6 +480,7 @@ FrameLayout ll_nav; TextView tv_video_1, tv_video_2, tv_video_3, tv_video_4, tv_video_5; View view; RatioLayout rl_picture; public AlbumVideoHolder(View view) { super(view); @@ -466,12 +503,14 @@ tv_nav_more = view.findViewById(R.id.tv_nav_more); tv_score = view.findViewById(R.id.tv_score); tv_director = view.findViewById(R.id.tv_director); rl_picture = view.findViewById(R.id.rl_picture); } } class SimpleVideoHolder extends RecyclerView.ViewHolder { ImageView iv_movie_cover; ImageView iv_vip; RatioLayout rl_picture; TextView tv_movie_title, tv_tag; View view; @@ -483,6 +522,7 @@ tv_movie_title = view.findViewById(R.id.tv_movie_title); tv_tag = view.findViewById(R.id.tv_tag); iv_vip = view.findViewById(R.id.iv_vip); rl_picture = view.findViewById(R.id.rl_picture); } } BuWanVideo/src/com/weikou/beibeivideo/ui/video/VideoColumn2Adapter.java
@@ -5,9 +5,6 @@ import android.content.Intent; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -17,15 +14,10 @@ import android.view.ViewGroup; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.DrawableImageViewTarget; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.transition.Transition; import com.lcjian.library.util.common.DimenUtils; import com.lcjian.library.util.common.StringUtils; import com.qq.e.ads.nativ.NativeUnifiedADData; import com.qq.e.ads.nativ.widget.NativeAdContainer; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.entity.VideoInfo; import com.weikou.beibeivideo.entity.ad.ExpressAdContainer; import com.weikou.beibeivideo.entity.recommend.holder.RecommendVideoAdHolder; @@ -33,20 +25,14 @@ import com.weikou.beibeivideo.entity.video.holder.FooterViewHolder; import com.weikou.beibeivideo.entity.video.holder.HeaderViewHolder; import com.weikou.beibeivideo.entity.video.holder.VideoHolder; import com.weikou.beibeivideo.ui.media.VideoDetailActivity; import com.weikou.beibeivideo.ui.media.VideoDetailActivity2; import com.weikou.beibeivideo.util.VideoUtil; import com.weikou.beibeivideo.util.ad.ExpressAdManager; import com.weikou.beibeivideo.util.ad.GDTConstant; import com.weikou.beibeivideo.util.ad.GDTNativeADUnifiedManager; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.util.video.VideoUIUtil; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade; public class VideoColumn2Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; BuWanVideo/src/com/weikou/beibeivideo/ui/video/VideoRecommendAdapter.java
@@ -153,7 +153,7 @@ } if (totalSize >= 6) { outRect.top = minWidth * 2; outRect.top = DimenUtils.dipToPixels(8, view.getContext()); } else outRect.top = 0; @@ -171,7 +171,7 @@ } } if (lastRow) outRect.bottom = minWidth * 2; outRect.bottom = DimenUtils.dipToPixels(8, view.getContext()); else outRect.bottom = 0; @@ -209,13 +209,13 @@ } if (index - 2 > 0) { outRect.top = minWidth * 3; outRect.top = DimenUtils.dipToPixels(8, view.getContext()); } else outRect.top = 0; if (total > 3) { if (index < ((total - 1) / 3) * 3) outRect.bottom = minWidth * 3; outRect.bottom = DimenUtils.dipToPixels(0, view.getContext()); else outRect.bottom = 0; } else @@ -459,6 +459,7 @@ if (viewHolder instanceof VideoHolder) { VideoHolder holder = (VideoHolder) viewHolder; final VideoInfo info = content.getVideo(); VideoUIUtil.setVideoListItem(mContext, holder, new View.OnClickListener() { @Override public void onClick(final View v) { @@ -492,8 +493,8 @@ int count = 0; if (contentList != null) count = contentList.size(); if (columns < 4) count = count % columns == 0 ? count : ((count / columns) * columns); // if (columns < 4) // count = count ;//% columns == 0 ? count : ((count / columns) * columns); if (headerView != null) count++; if (footerView != null) @@ -509,8 +510,8 @@ int count = contentList == null ? 0 : contentList.size(); int contentCount = count; if (columns < 4) contentCount = count % columns == 0 ? count : ((count / columns) * columns); // if (columns < 4) // contentCount = count % columns == 0 ? count : ((count / columns) * columns); if (position == 0) { if (headerView != null) BuWanVideo/src/com/weikou/beibeivideo/util/ad/SplashAdUtil.java
@@ -56,7 +56,8 @@ String channel = ManifestDataUtil.getAppMetaData(context, "UMENG_CHANNEL"); if (StringUtils.isNullOrEmpty(code)) code = BeibeiConstant.GDT_SPLASH_POSITION_ID; skip.setVisibility(View.VISIBLE); if (skip != null) skip.setVisibility(View.VISIBLE); gdtSplashAD = new SplashAD(context, skip, code, new SplashADListener() { @Override public void onADDismissed() { BuWanVideo/src/com/weikou/beibeivideo/util/browser/PPJavaInterface.java
@@ -105,6 +105,18 @@ eventListener.onPlayFinish(); } /** * 视频信息回调 * * @param name 视频名称 * @param cid * @param vid */ @JavascriptInterface public void videoInfo(String name, String cid, String vid) { } public interface IEventListener { public void onLogin(); BuWanVideo/src/com/weikou/beibeivideo/util/video/VideoUIUtil.java
@@ -1,9 +1,11 @@ package com.weikou.beibeivideo.util.video; import android.content.Context; import android.graphics.Typeface; import android.text.SpannableString; import android.text.Spanned; import android.text.style.AbsoluteSizeSpan; import android.text.style.StyleSpan; import android.view.View; import com.bumptech.glide.Glide; @@ -74,13 +76,13 @@ viewHolder.tv_tag.setVisibility(View.VISIBLE); } info.setScore("9.6"); if (!StringUtils.isEmpty(info.getScore())) { viewHolder.tv_score.setVisibility(View.VISIBLE); //改变 SpannableString spannableString = new SpannableString(info.getScore() + "分"); spannableString.setSpan(new AbsoluteSizeSpan(DimenUtils.spToPixels(13, mContext)), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); spannableString.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 0, info.getScore().length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); viewHolder.tv_score.setText(spannableString); } else { viewHolder.tv_score.setVisibility(View.INVISIBLE); gallery/.gitignore
New file @@ -0,0 +1 @@ /build gallery/build.gradle
New file @@ -0,0 +1,42 @@ apply plugin: 'com.android.library' android { compileSdkVersion 29 defaultConfig { minSdkVersion 19 targetSdkVersion 28 versionCode 13 versionName "1.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } lintOptions { abortOnError false } compileOptions { sourceCompatibility = 1.8 targetCompatibility = 1.8 } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(path: ':library-common') testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' //Glide api 'com.github.bumptech.glide:glide:4.9.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' } gallery/proguard-rules.pro
New file @@ -0,0 +1,21 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile gallery/src/androidTest/java/com/lzj/gallery/library/ExampleInstrumentedTest.java
New file @@ -0,0 +1,26 @@ package com.lzj.gallery.library; import android.content.Context; import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; /** * Instrumented test, which will execute on an Android device. * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test public void useAppContext() throws Exception { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); assertEquals("com.lzj.gallery.library.test", appContext.getPackageName()); } } gallery/src/main/AndroidManifest.xml
New file @@ -0,0 +1,2 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.lzj.gallery.library" /> gallery/src/main/java/com/lzj/gallery/library/adapter/BannerPagerAdapter.java
New file @@ -0,0 +1,143 @@ package com.lzj.gallery.library.adapter; import android.content.Context; import androidx.viewpager.widget.PagerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.lcjian.library.widget.RatioLayout; import com.lzj.gallery.library.R; import java.util.List; /** * Created by Administrator on 2018/11/28. * banner的适配器 */ public class BannerPagerAdapter extends PagerAdapter { private List<String> mList; private Context mContext; private int defaultImg = R.mipmap.ic_banner_error;//默认图片 private int mRoundCorners = -1; private int mMaxNumber;//最大banner数 private Float imgRatio; /** * 默认 * * @param defaultImg */ public void setDefaultImg(int defaultImg) { this.defaultImg = defaultImg; } /** * 设置圆角 * * @param mRoundCorners */ public void setmRoundCorners(int mRoundCorners) { this.mRoundCorners = mRoundCorners; } /** * 点击回调 */ public interface OnClickImagesListener { void onImagesClick(int position); } private OnClickImagesListener mImagesListener; public void setOnClickImagesListener(OnClickImagesListener listener) { mImagesListener = listener; } public BannerPagerAdapter(List<String> list, Context context, Float imgRatio) { // this.mList = list; this.imgRatio = imgRatio; this.mContext = context; if (mList == null) { mList = list; } if (list.size() > 9) { this.mMaxNumber = 9; } else { this.mMaxNumber = list.size(); } } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { View view = LayoutInflater.from(mContext).inflate(R.layout.banner_img_layout, container, false); ImageView imageView = view.findViewById(R.id.img); RatioLayout rl = view.findViewById(R.id.rl_img); if (imgRatio != null) rl.setRatio(imgRatio); final int index = position % mMaxNumber; LoadImage(mList.get(index), imageView); //OnClick imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mImagesListener.onImagesClick(index); } }); container.addView(view); return view; } /** * 加载图片 */ public void LoadImage(String url, ImageView imageview) { if (mRoundCorners == -1) { Glide.with(mContext) .load(url) // .centerCrop() .dontAnimate() .placeholder(defaultImg)// 加载中图片 .error(defaultImg) // 加载失败图片 .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)//设置磁盘缓存 .into(imageview); } else { Glide.with(mContext) .load(url) .centerCrop() .dontAnimate() .placeholder(defaultImg)// 加载中图片 .error(defaultImg) // 加载失败图片 .transform(new RoundedCorners(mRoundCorners)) // .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)//设置磁盘缓存 .into(imageview); } } } gallery/src/main/java/com/lzj/gallery/library/transformer/CornerTransform.java
New file @@ -0,0 +1,65 @@ package com.lzj.gallery.library.transformer; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import androidx.annotation.NonNull; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; import java.security.MessageDigest; /** * Created by Administrator on 2018/11/28. * 自定义圆角 */ public class CornerTransform extends BitmapTransformation { private static float radius = 0f; public CornerTransform(Context context) { this(context, 4); } public CornerTransform(Context context, int dp) { // super(context); radius = Resources.getSystem().getDisplayMetrics().density * dp; } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return roundCrop(pool, toTransform); } private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); canvas.drawRoundRect(rectF, radius, radius, paint); return result; } public String getId() { return getClass().getName() + Math.round(radius); } @Override public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { } } gallery/src/main/java/com/lzj/gallery/library/transformer/ZoomPageTransformer.java
New file @@ -0,0 +1,70 @@ package com.lzj.gallery.library.transformer; import androidx.viewpager.widget.ViewPager; import android.view.View; /** * Created by Administrator on 2018/11/28. * 3D画廊效果其实就是ViewPager的item切换时,进行缩放的动画效果 * */ public class ZoomPageTransformer implements ViewPager.PageTransformer { private static final float MAX_SCALE = 1.0f;//0缩放 private static final float MIN_SCALE = 0.85f;//0.85缩放 private float MIN_ALPHA = 1.0f;//最小透明度 public ZoomPageTransformer() { } public ZoomPageTransformer(float MIN_ALPHA) { this.MIN_ALPHA = MIN_ALPHA; } @Override public void transformPage(View view, float position) { //setScaleY只支持api11以上 /** * (-oo,-1) 相对于左边第一页,其左边的所有页面 ** * x、y拉伸为MIN_SCALE、透明度MIN_ALPHA */ if (position < -1) { view.setScaleX(MIN_SCALE); view.setScaleY(MIN_SCALE); view.setAlpha(MIN_ALPHA); } /** * [-1, 1 )当前页的左右第一页 */ else if (position < 1) { float scaleFactor = MIN_SCALE + (1 - Math.abs(position)) * (MAX_SCALE - MIN_SCALE); //[0, 1 ) 相对于当前选中页,其右边第一页 ** if (position > 0) { view.setTranslationX(-scaleFactor); } // [-1, 0 ) 相对于当前选中页,其左边的第一页** else if (position < 0) { view.setTranslationX(scaleFactor); } view.setScaleY(scaleFactor); view.setScaleX(scaleFactor); // float alpha = 1f - Math.abs(position) * (1 - ); float alpha = MIN_ALPHA + (1 - MIN_ALPHA) * (1 - Math.abs(position)); view.setAlpha(alpha); } /** * [1,+oo) 相对于右边第一页,其右边的所有页面 * x、y拉伸为MIN_SCALE、透明度MIN_ALPHA */ else { // (1,+Infinity] view.setScaleX(MIN_SCALE); view.setScaleY(MIN_SCALE); view.setAlpha(MIN_ALPHA); } } } gallery/src/main/java/com/lzj/gallery/library/views/BannerViewPager.java
New file @@ -0,0 +1,482 @@ package com.lzj.gallery.library.views; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.Handler; import androidx.viewpager.widget.ViewPager; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.lzj.gallery.library.R; import com.lzj.gallery.library.adapter.BannerPagerAdapter; import com.lzj.gallery.library.transformer.ZoomPageTransformer; import java.util.List; /** * Created by Administrator on 2018/11/28. * banner的控件处理 */ public class BannerViewPager extends RelativeLayout implements ViewPager.OnPageChangeListener { private View mLayout;//布局 private Activity mContext;//上下文 private ViewPager mViewPager;//viewpager private BannerPagerAdapter mPagerAdapter;//adapter private LinearLayout mLineIndicator;//指示器集合容器 private ImageView[] mImageView;//小圆点imageview对象 private List<String> mList;//url数组 private int mMaxNumber;//最大banner数 private int currentIndex = 0;//当前实际page private int startCurrentIndex = 2000;//当前page private long secondTime = 0, firstTime = 0; private boolean isSlide = false; //private Timer mTimer=null;//定时器 //private MyTimerTask mTimerTask=null; private Handler mHandler = null; private AutoRollRunnable mAutoRollRunnable = null; private int mRollTime = 5000; private int resId_piont_press = R.mipmap.ic_banner_point_press; private int resId_piont = R.mipmap.ic_banner_point; private boolean isPoint = false;//开启指示器 private float imgRatio;//显示图片的宽高比 public interface OnClickBannerListener { void onBannerClick(int position); } private OnClickBannerListener mBannerListener; public BannerViewPager addBannerListener(OnClickBannerListener listener) { mBannerListener = listener; return this; } //ui更新 // Handler mHandler=mHandler= new Handler(){ // public void handleMessage(Message msg) { // int index = mViewPager.getCurrentItem()+1;//下一个页 // mViewPager.setCurrentItem(index);//设置此次要显示的pager // currentIndex=index%mList.size(); // setImageBackground(currentIndex); // } // }; public BannerViewPager(Context context) { super(context); } public BannerViewPager(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public BannerViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = (Activity) context; } /** * 初始化viewpager * * @param list url集合 * @param isGallery 是否使用3D画廊效果 */ public BannerViewPager initBanner(List<String> list, boolean isGallery, float imgRatio) { this.imgRatio = imgRatio; checkException(list); if (mList == null) { mList = list; if (list.size() > 15) { mMaxNumber = 15; } else { mMaxNumber = list.size(); } } Log.i("test", "----------------------size=" + mList.size()); //引入布局 mLayout = LayoutInflater.from(mContext).inflate(R.layout.banner_view_layout, null); mViewPager = mLayout.findViewById(R.id.viewPager);//关闭 mLineIndicator = mLayout.findViewById(R.id.lineIndicator); //初始化位置 currentIndex = startCurrentIndex % mMaxNumber; mPagerAdapter = new BannerPagerAdapter(mList, mContext, imgRatio); mPagerAdapter.setOnClickImagesListener(new BannerPagerAdapter.OnClickImagesListener() { @Override public void onImagesClick(int position) { if (mBannerListener != null) { mBannerListener.onBannerClick(position); } } }); mViewPager.setAdapter(mPagerAdapter); if (isGallery) { mViewPager.setPageTransformer(true, new ZoomPageTransformer()); } mViewPager.setCurrentItem(startCurrentIndex); mViewPager.setOffscreenPageLimit(2);//设置预加载的数量,这里设置了2,会预加载中心item左边两个Item和右边两个Item mViewPager.addOnPageChangeListener(this); return this; } /** * 是否有adapter * * @return */ public boolean hasAdapter() { return mViewPager != null && mViewPager.getAdapter() != null; } public void notifyDataSetChanged() { if (mPagerAdapter != null) mPagerAdapter.notifyDataSetChanged(); } /** * 初始化viewpager * * @param list url集合 * @param isGallery 是否使用3D画廊效果 * @param alpha 滑动透明度变化 */ public BannerViewPager initBanner(List<String> list, boolean isGallery, float imgRatio, float alpha) { checkException(list); this.imgRatio = imgRatio; if (mList == null) { mList = list; if (list.size() > 15) { this.mMaxNumber = 15; } else { this.mMaxNumber = list.size(); } } Log.i("test", "----------------------size=" + mList.size()); //引入布局 mLayout = LayoutInflater.from(mContext).inflate(R.layout.banner_view_layout, null); mViewPager = mLayout.findViewById(R.id.viewPager);//关闭 mLineIndicator = mLayout.findViewById(R.id.lineIndicator); //初始化位置 currentIndex = startCurrentIndex % mMaxNumber; mPagerAdapter = new BannerPagerAdapter(mList, mContext,imgRatio); mPagerAdapter.setOnClickImagesListener(new BannerPagerAdapter.OnClickImagesListener() { @Override public void onImagesClick(int position) { if (mBannerListener != null) { mBannerListener.onBannerClick(position); } } }); mViewPager.setAdapter(mPagerAdapter); if (isGallery) { mViewPager.setPageTransformer(true, new ZoomPageTransformer(alpha)); } mViewPager.setCurrentItem(startCurrentIndex); mViewPager.setOffscreenPageLimit(2);//设置预加载的数量,这里设置了2,会预加载中心item左边两个Item和右边两个Item mViewPager.addOnPageChangeListener(this); return this; } /** * 添加默认图片,当加载失败后显示 * * @param resId_img * @return */ public BannerViewPager addDefaultImg(int resId_img) { mPagerAdapter.setDefaultImg(resId_img); return this; } /** * 添加圆角 * * @param corners * @return */ public BannerViewPager addRoundCorners(int corners) { mPagerAdapter.setmRoundCorners(corners); return this; } /** * @param columnMargin 两个Page之间的距离 * @param rowMargin page的外边距 * 注意当添加了3D画廊效果时,columnMargin尽量设小。应该本是已经进行了x、y的缩放 */ public BannerViewPager addPageMargin(int columnMargin, int rowMargin) { mViewPager.setPageMargin(dip2px(columnMargin)); RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layout.setMargins(dip2px(rowMargin), 0, dip2px(rowMargin), 0); mViewPager.setLayoutParams(layout); return this; } /** * 添加小圆点 * * @param distance 间距 */ public BannerViewPager addPointMargin(int distance) { isPoint = true; mImageView = new ImageView[mMaxNumber]; for (int i = 0; i < mMaxNumber; i++) { ImageView imageView = new ImageView(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(dip2px(distance) / 2, 0, dip2px(distance) / 2, 0); imageView.setLayoutParams(params); if (i == currentIndex) { imageView.setImageResource(resId_piont_press); } else { imageView.setImageResource(resId_piont); } mImageView[i] = imageView; mLineIndicator.addView(imageView); } return this; } /** * 添加小圆点 * * @param distance 间距 * @param piont_press 替换选中图标 * @param piont 替换未选中图片 */ public BannerViewPager addPoint(int distance, int piont_press, int piont) { isPoint = true; resId_piont_press = piont_press; resId_piont = piont; mImageView = new ImageView[mMaxNumber]; for (int i = 0; i < mMaxNumber; i++) { ImageView imageView = new ImageView(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(dip2px(distance) / 2, 0, dip2px(distance) / 2, 0); imageView.setLayoutParams(params); if (i == currentIndex) { imageView.setImageResource(resId_piont_press); } else { imageView.setImageResource(resId_piont); } mImageView[i] = imageView; mLineIndicator.addView(imageView); } return this; } /** * 添加小圆点底部间距 * * @param paddBottom */ public BannerViewPager addPointBottom(int paddBottom) { mLineIndicator.setPadding(0, 0, 0, dip2px(paddBottom)); return this; } /** * 配置完成,将布局添加到父容器 */ public BannerViewPager finishConfig() { this.addView(mLayout); return this; } //开始轮播 public BannerViewPager addStartTimer(int time) { mRollTime = time; if (mHandler == null) { mHandler = new Handler(); } if (mAutoRollRunnable == null) { mAutoRollRunnable = new AutoRollRunnable(); } mAutoRollRunnable.start(); return this; } // 停止轮播 public void stopTimer() { if (mAutoRollRunnable != null) { mAutoRollRunnable.stop(); } } private class AutoRollRunnable implements Runnable { //是否在轮播的标志 boolean isRunning = false; @SuppressLint("ClickableViewAccessibility") @Override public void run() { if (isRunning && !isSlide) { int index = mViewPager.getCurrentItem() + 1;//下一个页 mViewPager.setCurrentItem(index);//设置此次要显示的pager currentIndex = index % mMaxNumber; setImageBackground(currentIndex); mHandler.postDelayed(this, 1000 * mRollTime); } if (isSlide) { mHandler.postDelayed(this, 1000 * mRollTime); isSlide = false; } //轮播图触摸监听,解决滑动计时无法停止的问题 /* * viewPager监听触摸事件,因为我们要保证用户在手动滑动viewPager后,系统重新计时,viewPage按一定时间间隔循环展示, * 当手指按上屏幕或者是手指出现滑动动作,子线程都必须撤销(计时也就是消失) * 当手机松开之后系统重新计时,子线程与UI线程绑定,进行计时操作 */ mViewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: mHandler.removeCallbacks(mAutoRollRunnable); break; case MotionEvent.ACTION_UP: isSlide = true; mHandler.post(mAutoRollRunnable); break; } return false; } }); } public void start() { if (!isRunning) { isRunning = true; mHandler.removeCallbacks(this); mHandler.postDelayed(this, 1000 * mRollTime); } } public void stop() { if (isRunning) { mHandler.removeCallbacks(this); isRunning = false; } } } // /** // * 开启定时器 // * @param time // */ // public BannerViewPager addStartTimer(int time) { // if (mTimer == null) { // mTimer = new Timer(); // } // if(mTimerTask==null){ // mTimerTask=new MyTimerTask(); // } // mTimer.schedule(mTimerTask, 3000, 1000*time); // return this; // } // /** // * 停止定时器 // */ // public void stopTimer(){ // if(mTimer!=null){ // mTimer.cancel(); // mTimer = null; // } // if(mTimerTask!=null){ // mTimerTask.cancel(); // mTimerTask = null; // } // } // class MyTimerTask extends TimerTask { // @Override // public void run() { // mHandler.sendEmptyMessage(1001);//在此线程中,不能操作ui主线程 // } // } /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dip2px(float dpValue) { final float scale = mContext.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } //---------------viewpager滑动事件----------------- @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } /** * 滑动时同步改变底部小圆点 * * @param position */ @Override public void onPageSelected(int position) { currentIndex = position % mMaxNumber; setImageBackground(currentIndex); } /** * 改变指示器 * * @param selectItemsIndex */ private void setImageBackground(int selectItemsIndex) { if (isPoint) { for (int i = 0; i < mImageView.length; i++) { if (i == selectItemsIndex) { mImageView[i].setImageResource(resId_piont_press); } else { mImageView[i].setImageResource(resId_piont); } } } } /** * 检查异常 * * @param list */ private void checkException(List<String> list) { if (list == null) { throw new NullPointerException("The array is null at initBanner function"); } if (list.size() == 0) { throw new ArithmeticException("Your array size is 0"); } } } gallery/src/main/res/layout/banner_img_layout.xml
New file @@ -0,0 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <com.lcjian.library.widget.RatioLayout android:id="@+id/rl_img" android:layout_width="wrap_content" android:layout_height="wrap_content" app:ratio="0.7"> <ImageView android:id="@+id/img" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY" /> </com.lcjian.library.widget.RatioLayout> </RelativeLayout> gallery/src/main/res/layout/banner_view_layout.xml
New file @@ -0,0 +1,40 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rootView" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="false"> <!--viewpager--> <androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="false" android:layout_marginLeft="60dp" android:layout_marginRight="60dp"/> <!--指示器--> <LinearLayout android:id="@+id/lineIndicator" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:orientation="horizontal" android:paddingBottom="7dp" android:gravity="center"> <!--<ImageView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:src="@mipmap/ic_banner_point_press"--> <!--android:layout_marginLeft="8dp"--> <!--android:layout_marginRight="8dp"/>--> </LinearLayout> </RelativeLayout> gallery/src/main/res/mipmap-xhdpi/ic_banner_error.png
gallery/src/main/res/mipmap-xhdpi/ic_banner_point.png
gallery/src/main/res/mipmap-xhdpi/ic_banner_point_press.png
gallery/src/main/res/values/strings.xml
New file @@ -0,0 +1,3 @@ <resources> <string name="app_name">gallery</string> </resources> gallery/src/test/java/com/lzj/gallery/library/ExampleUnitTest.java
New file @@ -0,0 +1,17 @@ package com.lzj.gallery.library; import org.junit.Test; import static org.junit.Assert.*; /** * Example local unit test, which will execute on the development machine (host). * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ public class ExampleUnitTest { @Test public void addition_isCorrect() throws Exception { assertEquals(4, 2 + 2); } } library-common/src/com/lcjian/library/util/glide/GlideRoundTransform.java
@@ -8,6 +8,7 @@ import android.graphics.Paint; import android.graphics.RectF; import android.support.annotation.NonNull; import android.util.Log; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; @@ -25,8 +26,9 @@ */ public class GlideRoundTransform extends BitmapTransformation { private static final String ID = GlideRoundTransform.class.getClass().getName(); private static final String TAG = "GlideRoundTransform"; private static byte[] ID_BYTES = null; private static float radius = 0f; private float radius = 0f; public GlideRoundTransform(Context context) { this(context, 12); @@ -54,10 +56,12 @@ return roundCrop(pool, bitmap == null ? toTransform : bitmap); } private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { private Bitmap roundCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; Log.i(TAG, "源图片大小:" + source.getWidth() + "-" + source.getHeight()); Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (result == null) { settings.gradle
@@ -9,4 +9,5 @@ include ':library-DownloadProvider' include ':library-common' include ':library-APPUpdate' include ':gallery' include ':BuWanVideo'