Просмотр исходного кода

添加并测试新控件:分页、TitleBar

Frankensteinly 1 год назад
Родитель
Сommit
d300a8c6ad

+ 297 - 0
app/src/main/java/com/grkj/iscs/PageControl.java

@@ -0,0 +1,297 @@
+package com.grkj.iscs;
+
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.grkj.iscs.util.Utils;
+
+/**
+ * @date 2018/12/16
+ *
+ * 分页
+ */
+public class PageControl extends LinearLayout implements View.OnClickListener {
+    private Context context;
+    private int maxPage = 1;//最大页
+    private int curPage = 1;//当前页
+    private int buttonCount = 5;//按钮数
+    private int lastButton = 0;//最后一个按钮对应的页码
+    private int firstButton = 0;//第一个按钮对应的页码
+    private int totalCount; //总页数
+    public TextView upPage;//上一页
+    public TextView downPage;//下一页
+
+    public PageControl(Context context) {
+        this(context, null);
+    }
+
+    public PageControl(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public PageControl(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        this.context = context;
+        this.setBackgroundResource(R.color.white);
+        this.setGravity(Gravity.RIGHT);
+        initPageComposite();
+    }
+
+    private OnPageChangeListener mPageChangeLinstener = new OnPageChangeListener() {
+        @Override
+        public void pageChanged(PageControl pageControl,int numPerPage) {
+            if(mPageChangeLinstener != null){
+                mPageChangeLinstener.pageChanged(pageControl,numPerPage);
+            }
+        }
+    };
+
+    public interface OnPageChangeListener {
+        void pageChanged(PageControl pageControl,int numPerPage);
+    }
+
+    /**
+     * @param tCount 总页数
+     */
+    public void setTotalPage(int tCount) {
+        totalCount =  tCount;
+        setSelectView(curPage);
+    }
+
+    /**
+     * 创建view
+     * @return
+     */
+    private TextView createView() {
+        TextView page = new TextView(context);
+//        page.setBackgroundResource(R.drawable.selecter_btn_round5_gray);
+        page.setPadding(Utils.INSTANCE.dip2px(10), 0, Utils.INSTANCE.dip2px(10), 0);
+        page.setGravity(Gravity.CENTER);
+        LayoutParams layoutParam = new LayoutParams(LayoutParams.WRAP_CONTENT, Utils.INSTANCE.dip2px(30));
+        page.setMinWidth(Utils.INSTANCE.dip2px(30));
+        layoutParam.setMargins(0, 0, Utils.INSTANCE.dip2px(5), 0);
+        page.setLayoutParams(layoutParam);
+        return page;
+    }
+
+    /**
+     * 创建中间页码view
+     * @param page
+     */
+    private void createView(int page) {
+        TextView countPage = createView();
+        countPage.setText(page + "");
+        countPage.setTag(page);
+        countPage.setOnClickListener(this);
+        this.addView(countPage);
+    }
+    /**
+     * 创建上一页view
+     */
+    private void createPrevious() {
+        upPage = createView();
+//        upPage.setText(getResources().getString(R.string.page_uppage));
+        upPage.setText("上一页");
+        upPage.setOnClickListener(this);
+        this.addView(upPage, 0);
+    }
+    /**
+     * 创建下一页view
+     */
+    private void createNext() {
+        downPage = createView();
+//        downPage.setText(getResources().getString(R.string.page_downpage));
+        downPage.setText("下一页");
+        downPage.setOnClickListener(this);
+        this.addView(downPage);
+    }
+    /**
+     * n个页 创建第一个view
+     */
+    private void first() {
+        TextView first = createView();
+        first.setText("1");
+        first.setOnClickListener(this);
+        this.addView(first);
+    }
+
+    /**
+     * n个页 创建末页view
+     */
+    private void last() {
+        TextView first = createView();
+        first.setText(totalCount+"");
+        first.setOnClickListener(this);
+        this.addView(first);
+    }
+    /**
+     * n个页 创建...
+     */
+    private void middleView() {
+        TextView first = new TextView(context);
+        first.setText("...");
+        first.setPadding(Utils.INSTANCE.dip2px(10), 0, Utils.INSTANCE.dip2px(10), 0);
+        first.setGravity(Gravity.CENTER);
+        first.setOnClickListener(this);
+        this.addView(first);
+    }
+
+
+    public void initPageComposite() {
+        int temp = maxPage;
+        maxPage = totalCount % 1 == 0 ? totalCount / 1 : totalCount / 1 + 1;
+
+        if (temp != maxPage || curPage >= 1) {
+            createAllView();
+        }
+        if (maxPage == 0) {
+            removeAllViews();
+            return;
+        }
+        setSelectView(curPage);
+        setActionStatus(curPage);
+    }
+
+    /**
+     * 当前页码为1的时候上一页不可点击
+     * 当前页码为末页的时候下一页不可点击
+     * @param curPage
+     */
+    private void setActionStatus(int curPage) {
+        if (curPage > 1) {
+            upPage.setEnabled(true);
+        }else {
+            upPage.setEnabled(false);
+        }
+        if(totalCount > curPage){
+            downPage.setEnabled(true);
+        }else {
+            downPage.setEnabled(false);
+        }
+    }
+    private void setBtnGroup() {
+        int n = maxPage / buttonCount;
+        if (n == 0) {
+            //只有一组
+            firstButton = 1;
+            lastButton = maxPage;
+        } else {
+            int i = curPage / buttonCount;
+            //有n组
+            firstButton = i * buttonCount + 1;
+            if (firstButton > curPage) {
+                firstButton = (i - 1) * buttonCount + 1;
+            }
+            lastButton = (firstButton - 1) + buttonCount;
+            if (lastButton > maxPage && lastButton > 1) {
+                lastButton = maxPage;
+            }
+
+        }
+    }
+
+    private void createAllView() {
+        setBtnGroup();
+        this.removeAllViews();
+        this.setPadding(Utils.INSTANCE.dip2px(10), Utils.INSTANCE.dip2px(20), Utils.INSTANCE.dip2px(10), Utils.INSTANCE.dip2px(20));
+        createPrevious();
+        if((firstButton >= buttonCount ||curPage == buttonCount)&& totalCount > buttonCount){
+            firstButton = curPage - 2;
+            lastButton = curPage + 2;
+        }
+        if(firstButton > 1 && totalCount > buttonCount){
+            first();
+            middleView();
+        }
+        while (firstButton <= lastButton && firstButton <= totalCount) {
+            createView(firstButton);
+            firstButton++;
+        }
+        if(lastButton < totalCount){
+            middleView();
+            last();
+        }
+        createNext();
+    }
+
+    @Override
+    public void onClick(View view) {
+        if (mPageChangeLinstener == null) return;
+        if (view instanceof TextView) {
+            TextView tv = (TextView) view;
+            String txt = tv.getText().toString();
+//            if (txt.equalsIgnoreCase(getResources().getString(R.string.page_uppage))) {
+            if (txt.equalsIgnoreCase("上一页")) {
+                curPage -= 1;
+                curPage = curPage >= 1 ? curPage : 1;
+                setSelectView(curPage);
+                mPageChangeLinstener.pageChanged(this, curPage);
+                initPageComposite();
+                return;
+            }
+//            if (txt.equalsIgnoreCase(getResources().getString(R.string.page_downpage))) {
+            if (txt.equalsIgnoreCase("下一页")) {
+                curPage += 1;
+                curPage = curPage <= maxPage ? curPage : maxPage;
+                setSelectView(curPage);
+                mPageChangeLinstener.pageChanged(this,curPage);
+                initPageComposite();
+                return;
+            }
+            if(txt.equalsIgnoreCase(String.valueOf(1))){
+                curPage = 1;
+                setSelectView(curPage);
+                mPageChangeLinstener.pageChanged(this,curPage);
+                initPageComposite();
+                return;
+            }
+            if(txt.equalsIgnoreCase(String.valueOf(totalCount))){
+                curPage = totalCount;
+                setSelectView(curPage);
+                mPageChangeLinstener.pageChanged(this,curPage);
+                initPageComposite();
+                return;
+            }
+        }
+        if (view.getTag() != null) {
+            Object tag = view.getTag();
+            curPage = Integer.parseInt(tag.toString());
+            mPageChangeLinstener.pageChanged(this,curPage);
+            setSelectView(curPage);
+            initPageComposite();
+        }
+    }
+
+    private void setSelectView(int n) {
+        for (int i = 0; i < this.getChildCount(); i++) {
+            View v = this.getChildAt(i);
+            if (v.getTag() != null) {
+                int tag = Integer.parseInt(v.getTag().toString());
+                if (tag == n) {
+                    v.setSelected(true);
+//                    v.setBackgroundResource(R.drawable.selecter_btn_round5_red);
+                } else {
+                    v.setSelected(false);
+//                    v.setBackgroundResource(R.drawable.selecter_btn_round5_gray);
+                }
+            }
+        }
+    }
+
+    /**
+     * 设置分页监听事件
+     */
+    public void setPageChangeListener(OnPageChangeListener pageChangeListener) {
+        this.mPageChangeLinstener = pageChangeListener;
+    }
+
+
+}
+

+ 6 - 0
app/src/main/java/com/grkj/iscs/activity/WebSocketActivity.kt

@@ -18,5 +18,11 @@ class WebSocketActivity : BaseActivity<ActivityWebSocketBinding>() {
             LogUtil.i("haha1 : $stomp")
             LogUtil.i("haha2 : $destination")
         }
+
+        mBinding?.page?.setTotalPage(10)
+        mBinding?.page?.initPageComposite()
+        mBinding?.page?.setPageChangeListener { pageControl, numPerPage ->
+            LogUtil.i("pageControl: $pageControl, numPerPage: $numPerPage")
+        }
     }
 }

+ 10 - 0
app/src/main/java/com/grkj/iscs/util/Utils.kt

@@ -0,0 +1,10 @@
+package com.grkj.iscs.util
+
+import com.grkj.iscs.MyApplication
+
+object Utils {
+    fun dip2px(dpValue: Float): Int {
+        val density = MyApplication.instance!!.resources.displayMetrics.density
+        return (dpValue * density + 0.5f).toInt()
+    }
+}

+ 28 - 0
app/src/main/java/com/grkj/iscs/widget/TitleBar.kt

@@ -0,0 +1,28 @@
+package com.grkj.iscs.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import androidx.constraintlayout.widget.ConstraintLayout
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.LayoutTitleBarBinding
+
+class TitleBar(private val ctx: Context, attrs: AttributeSet) : ConstraintLayout(ctx, attrs) {
+
+    private var mBinding: LayoutTitleBarBinding
+
+    init {
+        val root = View.inflate(ctx, R.layout.layout_title_bar, this)
+        mBinding = LayoutTitleBarBinding.bind(root)
+        mBinding.ivBack.setOnClickListener {
+            if (ctx is AppCompatActivity) {
+               ctx.finish()
+            }
+        }
+    }
+
+    fun setTitle(title: String) {
+        mBinding.tvTitle.text = title
+    }
+}

+ 13 - 3
app/src/main/res/layout/activity_web_socket.xml

@@ -1,10 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/main"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:background="#123456"
     tools:context=".activity.WebSocketActivity">
 
-</androidx.constraintlayout.widget.ConstraintLayout>
+    <com.grkj.iscs.PageControl
+        android:id="@+id/page"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <com.grkj.iscs.widget.TitleBar
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/page"/>
+
+</RelativeLayout>

+ 54 - 0
app/src/main/res/layout/layout_title_bar.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/title_bar"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/common_title_bar_height"
+    android:background="@color/main_color"
+    android:padding="@dimen/common_title_bar_padding">
+
+
+    <ImageView
+        android:id="@+id/iv_back"
+        android:layout_width="@dimen/common_title_bar_back_size"
+        android:layout_height="@dimen/common_title_bar_back_size"
+        android:background="@color/white"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="@dimen/common_title_bar_title_text_size"
+        android:layout_height="@dimen/common_title_bar_title_text_size"
+        android:textSize="@dimen/common_title_bar_title_text_size"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_num"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/title_bar_current_work_ticket_num"
+        android:textColor="@color/white"
+        android:textSize="@dimen/common_title_bar_sub_title_text_size"
+        app:layout_constraintBottom_toTopOf="@id/tc_clock"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+    <TextClock
+        android:id="@+id/tc_clock"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:format12Hour="yyyy年MM月dd日 hh:mm:ss"
+        android:format24Hour="yyyy年MM月dd日 hh:mm:ss"
+        android:gravity="center"
+        android:textColor="@color/white"
+        android:textSize="@dimen/common_title_bar_sub_title_text_size"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_num" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 0
app/src/main/res/values/colors.xml

@@ -3,4 +3,6 @@
     <color name="black">#FF000000</color>
     <color name="white">#FFFFFFFF</color>
     <color name="aquamarine">#7FFFD4</color>
+
+    <color name="main_color">#644bd8</color>
 </resources>

+ 8 - 0
app/src/main/res/values/dimens.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="common_title_bar_height">150px</dimen>
+    <dimen name="common_title_bar_padding">10px</dimen>
+    <dimen name="common_title_bar_title_text_size">30sp</dimen>
+    <dimen name="common_title_bar_sub_title_text_size">10sp</dimen>
+    <dimen name="common_title_bar_back_size">50px</dimen>
+</resources>

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -4,4 +4,6 @@
     <string name="common_net_dis">请确认网络状态正常后重试!</string>
     <string name="common_net_download">请确认网络状态正常且下载地址无误后重试!</string>
     <string name="common_download_erro_notag">下载失败!请确认文件存储位置后重试</string>
+    
+    <string name="title_bar_current_work_ticket_num">当前作业数:%d</string>
 </resources>