parent
c1d8789c9e
commit
0fb5b366a7
@ -1,46 +0,0 @@ |
||||
LeanbackTvSample |
||||
===== |
||||
|
||||
[![简书](https://img.shields.io/badge/%E7%AE%80%E4%B9%A6-iSuperRed-brightgreen.svg)](http://www.jianshu.com/u/c2e31017da0e) |
||||
| [简体中文文档][1] |
||||
|
||||
LeanbackTvSample is a smart TV desktop application based on the Android platform written by Google's open source framework Leanback. |
||||
|
||||
<p align="center"> |
||||
<img width="320" src="logo/leanback_logo.png"> |
||||
</p> |
||||
|
||||
效果图 |
||||
------- |
||||
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_1.png" width="960" alt="效果图"/> |
||||
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_2.png" width="960" alt="效果图"/> |
||||
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_3.png" width="960" alt="效果图"/> |
||||
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_4.png" width="960" alt="效果图"/> |
||||
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_5.png" width="960" alt="效果图"/> |
||||
<img src="https://github.com/iSuperRed/LeanbackTvSample/blob/master/screenshot/LeanbackTvSample_6.png" width="960" alt="效果图"/> |
||||
|
||||
License |
||||
------- |
||||
``` |
||||
Copyright (c) 2019 iSuperRed |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
||||
``` |
||||
|
||||
[1]: https://www.jianshu.com/p/b286e087b074 |
@ -0,0 +1,36 @@ |
||||
package com.unionmed.unionmedtv.api; |
||||
|
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
import com.hjq.http.config.IRequestApi; |
||||
import com.hjq.http.config.IRequestType; |
||||
import com.hjq.http.model.BodyType; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* desc : 发送短信验证码 |
||||
*/ |
||||
public final class GetCodeApi implements IRequestApi, IRequestType { |
||||
|
||||
@NonNull |
||||
@Override |
||||
public BodyType getBodyType() { |
||||
return BodyType.JSON; |
||||
} |
||||
|
||||
@NonNull |
||||
@Override |
||||
public String getApi() { |
||||
return "/index/sendMessageCode"; |
||||
} |
||||
|
||||
private String mobile; |
||||
private int type; |
||||
|
||||
public GetCodeApi(String mobile, int type) { |
||||
this.mobile = mobile; |
||||
this.type = type; |
||||
} |
||||
} |
@ -0,0 +1,490 @@ |
||||
package com.unionmed.unionmedtv.api; |
||||
|
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
import com.github.stuxuhai.jpinyin.PinyinException; |
||||
import com.github.stuxuhai.jpinyin.PinyinHelper; |
||||
import com.hjq.http.config.IRequestApi; |
||||
import com.hjq.http.config.IRequestType; |
||||
import com.hjq.http.model.BodyType; |
||||
|
||||
import java.util.Objects; |
||||
|
||||
/** |
||||
* desc : 发送短信验证码 |
||||
*/ |
||||
public final class MobileLoginApi implements IRequestApi, IRequestType { |
||||
|
||||
@NonNull |
||||
@Override |
||||
public BodyType getBodyType() { |
||||
return BodyType.JSON; |
||||
} |
||||
|
||||
@NonNull |
||||
@Override |
||||
public String getApi() { |
||||
return "/index/sendMessageCode"; |
||||
} |
||||
|
||||
private String mobile; |
||||
private String code; |
||||
|
||||
public MobileLoginApi(String mobile, String code) { |
||||
this.mobile = mobile; |
||||
this.code = code; |
||||
} |
||||
|
||||
public final static class TokenBean { |
||||
|
||||
/** |
||||
* name : 林瑞金 |
||||
* headImg : null |
||||
* mobile : 15905997060 |
||||
* preRegion : {"pkey":"15","ip":"47.118.51.167","port":"8065","fmsvr":"rtmp://10.120.224.5/livepkgr/","msgsvr":"http://120.195.56.245:3190/msg_server","ipsvr":"https://mobile.union-med.net/app/appintegrate/v1.8","msgip":"120.195.56.245","oder_num":4,"memo":"福州","svalue":"rtmp://10.120.224.5/livepkgr/","filesvr":"http://47.118.51.167:8999/eleand/"} |
||||
* isAtuh : 1 |
||||
* isuse : null |
||||
* online : null |
||||
* faceAuthFlag : 1 |
||||
* upkey : 4262 |
||||
* pkey : null |
||||
* identity_id : 350500199107135035 |
||||
* isSetPsw : 0 |
||||
* im_useraccount : 4262 |
||||
* im_password : null |
||||
* im_token : aMoc5MIihofCrtEW13iC7YL9uCPhRbbiDN4O4yV6HZC1i+9NneL2fU4Qn0g= |
||||
* currentAddress : {"addressKey":"435","pkey":"4262","name":"拒绝","sex":null,"mobile":"15905997060","address":"福建省福州市鼓楼区白马北路201-207号一号3号楼","detailAddress":"12","isCurrent":"1","isDefault":"1","xzqh":"3501","createTime":"1682577679","isDelete":"0"} |
||||
* userType : null |
||||
* token : c6011b69-cb6d-410f-a24f-75806cebcca0 |
||||
*/ |
||||
|
||||
private String name; |
||||
private Object headImg; |
||||
private String mobile; |
||||
private City preRegion; |
||||
private String isAtuh; |
||||
private Object isuse; |
||||
private Object online; |
||||
private int faceAuthFlag; |
||||
private String upkey; |
||||
private Object pkey; |
||||
private String identity_id; |
||||
private String isSetPsw; |
||||
private String im_useraccount; |
||||
private String im_password; |
||||
private String im_token; |
||||
private CurrentAddressBean currentAddress; |
||||
private Object userType; |
||||
private String token; |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public Object getHeadImg() { |
||||
return headImg; |
||||
} |
||||
|
||||
public void setHeadImg(Object headImg) { |
||||
this.headImg = headImg; |
||||
} |
||||
|
||||
public String getMobile() { |
||||
return mobile; |
||||
} |
||||
|
||||
public void setMobile(String mobile) { |
||||
this.mobile = mobile; |
||||
} |
||||
|
||||
public City getPreRegion() { |
||||
return preRegion; |
||||
} |
||||
|
||||
public void setPreRegion(City preRegion) { |
||||
this.preRegion = preRegion; |
||||
} |
||||
|
||||
public String getIsAtuh() { |
||||
return isAtuh; |
||||
} |
||||
|
||||
public void setIsAtuh(String isAtuh) { |
||||
this.isAtuh = isAtuh; |
||||
} |
||||
|
||||
public Object getIsuse() { |
||||
return isuse; |
||||
} |
||||
|
||||
public void setIsuse(Object isuse) { |
||||
this.isuse = isuse; |
||||
} |
||||
|
||||
public Object getOnline() { |
||||
return online; |
||||
} |
||||
|
||||
public void setOnline(Object online) { |
||||
this.online = online; |
||||
} |
||||
|
||||
public int getFaceAuthFlag() { |
||||
return faceAuthFlag; |
||||
} |
||||
|
||||
public void setFaceAuthFlag(int faceAuthFlag) { |
||||
this.faceAuthFlag = faceAuthFlag; |
||||
} |
||||
|
||||
public String getUpkey() { |
||||
return upkey; |
||||
} |
||||
|
||||
public void setUpkey(String upkey) { |
||||
this.upkey = upkey; |
||||
} |
||||
|
||||
public Object getPkey() { |
||||
return pkey; |
||||
} |
||||
|
||||
public void setPkey(Object pkey) { |
||||
this.pkey = pkey; |
||||
} |
||||
|
||||
public String getIdentity_id() { |
||||
return identity_id; |
||||
} |
||||
|
||||
public void setIdentity_id(String identity_id) { |
||||
this.identity_id = identity_id; |
||||
} |
||||
|
||||
public String getIsSetPsw() { |
||||
return isSetPsw; |
||||
} |
||||
|
||||
public void setIsSetPsw(String isSetPsw) { |
||||
this.isSetPsw = isSetPsw; |
||||
} |
||||
|
||||
public String getIm_useraccount() { |
||||
return im_useraccount; |
||||
} |
||||
|
||||
public void setIm_useraccount(String im_useraccount) { |
||||
this.im_useraccount = im_useraccount; |
||||
} |
||||
|
||||
public String getIm_password() { |
||||
return im_password; |
||||
} |
||||
|
||||
public void setIm_password(String im_password) { |
||||
this.im_password = im_password; |
||||
} |
||||
|
||||
public String getIm_token() { |
||||
return im_token; |
||||
} |
||||
|
||||
public void setIm_token(String im_token) { |
||||
this.im_token = im_token; |
||||
} |
||||
|
||||
public CurrentAddressBean getCurrentAddress() { |
||||
return currentAddress; |
||||
} |
||||
|
||||
public void setCurrentAddress(CurrentAddressBean currentAddress) { |
||||
this.currentAddress = currentAddress; |
||||
} |
||||
|
||||
public Object getUserType() { |
||||
return userType; |
||||
} |
||||
|
||||
public void setUserType(Object userType) { |
||||
this.userType = userType; |
||||
} |
||||
|
||||
public String getToken() { |
||||
return token; |
||||
} |
||||
|
||||
public void setToken(String token) { |
||||
this.token = token; |
||||
} |
||||
|
||||
public static class City implements Comparable<City>{ |
||||
/** |
||||
* pkey : 15 |
||||
* ip : 47.118.51.167 |
||||
* port : 8065 |
||||
* fmsvr : rtmp://10.120.224.5/livepkgr/
|
||||
* msgsvr : http://120.195.56.245:3190/msg_server
|
||||
* ipsvr : https://mobile.union-med.net/app/appintegrate/v1.8
|
||||
* msgip : 120.195.56.245 |
||||
* oder_num : 4 |
||||
* memo : 福州 |
||||
* svalue : rtmp://10.120.224.5/livepkgr/
|
||||
* filesvr : http://47.118.51.167:8999/eleand/
|
||||
*/ |
||||
|
||||
private String pkey; |
||||
private String ip; |
||||
private String port; |
||||
private String fmsvr; |
||||
private String msgsvr; |
||||
private String ipsvr; |
||||
private String msgip; |
||||
private int oder_num; |
||||
private String memo; |
||||
private String svalue; |
||||
private String filesvr; |
||||
|
||||
public String getPkey() { |
||||
return pkey; |
||||
} |
||||
|
||||
public void setPkey(String pkey) { |
||||
this.pkey = pkey; |
||||
} |
||||
|
||||
public String getIp() { |
||||
return ip; |
||||
} |
||||
|
||||
public void setIp(String ip) { |
||||
this.ip = ip; |
||||
} |
||||
|
||||
public String getPort() { |
||||
return port; |
||||
} |
||||
|
||||
public void setPort(String port) { |
||||
this.port = port; |
||||
} |
||||
|
||||
public String getFmsvr() { |
||||
return fmsvr; |
||||
} |
||||
|
||||
public void setFmsvr(String fmsvr) { |
||||
this.fmsvr = fmsvr; |
||||
} |
||||
|
||||
public String getMsgsvr() { |
||||
return msgsvr; |
||||
} |
||||
|
||||
public void setMsgsvr(String msgsvr) { |
||||
this.msgsvr = msgsvr; |
||||
} |
||||
|
||||
public String getIpsvr() { |
||||
return ipsvr; |
||||
} |
||||
|
||||
public void setIpsvr(String ipsvr) { |
||||
this.ipsvr = ipsvr; |
||||
} |
||||
|
||||
public String getMsgip() { |
||||
return msgip; |
||||
} |
||||
|
||||
public void setMsgip(String msgip) { |
||||
this.msgip = msgip; |
||||
} |
||||
|
||||
public int getOder_num() { |
||||
return oder_num; |
||||
} |
||||
|
||||
public void setOder_num(int oder_num) { |
||||
this.oder_num = oder_num; |
||||
} |
||||
|
||||
public String getMemo() { |
||||
return memo; |
||||
} |
||||
|
||||
public void setMemo(String memo) { |
||||
this.memo = memo; |
||||
} |
||||
|
||||
public String getSvalue() { |
||||
return svalue; |
||||
} |
||||
|
||||
public void setSvalue(String svalue) { |
||||
this.svalue = svalue; |
||||
} |
||||
|
||||
public String getFilesvr() { |
||||
return filesvr; |
||||
} |
||||
|
||||
public void setFilesvr(String filesvr) { |
||||
this.filesvr = filesvr; |
||||
} |
||||
|
||||
@Override |
||||
public int compareTo(City city) { |
||||
try { |
||||
return PinyinHelper.getShortPinyin(this.memo) |
||||
.compareTo(PinyinHelper.getShortPinyin(city.memo)); |
||||
} catch (PinyinException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
return 0; |
||||
} |
||||
@Override |
||||
public boolean equals(Object o) { |
||||
if (this == o) return true; |
||||
if (o == null || getClass() != o.getClass()) return false; |
||||
City city = (City) o; |
||||
return memo.equals(city.memo); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return Objects.hash(memo); |
||||
} |
||||
} |
||||
|
||||
public static class CurrentAddressBean { |
||||
/** |
||||
* addressKey : 435 |
||||
* pkey : 4262 |
||||
* name : 拒绝 |
||||
* sex : null |
||||
* mobile : 15905997060 |
||||
* address : 福建省福州市鼓楼区白马北路201-207号一号3号楼 |
||||
* detailAddress : 12 |
||||
* isCurrent : 1 |
||||
* isDefault : 1 |
||||
* xzqh : 3501 |
||||
* createTime : 1682577679 |
||||
* isDelete : 0 |
||||
*/ |
||||
|
||||
private String addressKey; |
||||
private String pkey; |
||||
private String name; |
||||
private Object sex; |
||||
private String mobile; |
||||
private String address; |
||||
private String detailAddress; |
||||
private String isCurrent; |
||||
private String isDefault; |
||||
private String xzqh; |
||||
private String createTime; |
||||
private String isDelete; |
||||
|
||||
public String getAddressKey() { |
||||
return addressKey; |
||||
} |
||||
|
||||
public void setAddressKey(String addressKey) { |
||||
this.addressKey = addressKey; |
||||
} |
||||
|
||||
public String getPkey() { |
||||
return pkey; |
||||
} |
||||
|
||||
public void setPkey(String pkey) { |
||||
this.pkey = pkey; |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public Object getSex() { |
||||
return sex; |
||||
} |
||||
|
||||
public void setSex(Object sex) { |
||||
this.sex = sex; |
||||
} |
||||
|
||||
public String getMobile() { |
||||
return mobile; |
||||
} |
||||
|
||||
public void setMobile(String mobile) { |
||||
this.mobile = mobile; |
||||
} |
||||
|
||||
public String getAddress() { |
||||
return address; |
||||
} |
||||
|
||||
public void setAddress(String address) { |
||||
this.address = address; |
||||
} |
||||
|
||||
public String getDetailAddress() { |
||||
return detailAddress; |
||||
} |
||||
|
||||
public void setDetailAddress(String detailAddress) { |
||||
this.detailAddress = detailAddress; |
||||
} |
||||
|
||||
public String getIsCurrent() { |
||||
return isCurrent; |
||||
} |
||||
|
||||
public void setIsCurrent(String isCurrent) { |
||||
this.isCurrent = isCurrent; |
||||
} |
||||
|
||||
public String getIsDefault() { |
||||
return isDefault; |
||||
} |
||||
|
||||
public void setIsDefault(String isDefault) { |
||||
this.isDefault = isDefault; |
||||
} |
||||
|
||||
public String getXzqh() { |
||||
return xzqh; |
||||
} |
||||
|
||||
public void setXzqh(String xzqh) { |
||||
this.xzqh = xzqh; |
||||
} |
||||
|
||||
public String getCreateTime() { |
||||
return createTime; |
||||
} |
||||
|
||||
public void setCreateTime(String createTime) { |
||||
this.createTime = createTime; |
||||
} |
||||
|
||||
public String getIsDelete() { |
||||
return isDelete; |
||||
} |
||||
|
||||
public void setIsDelete(String isDelete) { |
||||
this.isDelete = isDelete; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,64 @@ |
||||
package com.unionmed.unionmedtv.dialog; |
||||
|
||||
import android.content.Context; |
||||
import android.view.View; |
||||
import android.widget.TextView; |
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
import com.lxj.xpopup.core.CenterPopupView; |
||||
import com.unionmed.unionmedtv.R; |
||||
|
||||
public class TipDialog extends CenterPopupView { |
||||
private TextView tv_cancel; |
||||
private TextView tv_title; |
||||
private TextView tv_confirm; |
||||
private String title; |
||||
private DialogClick dialogClick; |
||||
|
||||
public TipDialog(@NonNull Context context, String title, DialogClick dialogClick) { |
||||
super(context); |
||||
this.title = title; |
||||
this.dialogClick = dialogClick; |
||||
} |
||||
|
||||
@Override |
||||
protected int getImplLayoutId() { |
||||
return R.layout.dialog_tip; |
||||
} |
||||
|
||||
@Override |
||||
protected void onCreate() { |
||||
super.onCreate(); |
||||
tv_cancel = findViewById(R.id.tv_cancel); |
||||
tv_cancel.requestFocus(); |
||||
tv_cancel.setOnClickListener(new OnClickListener() { |
||||
@Override |
||||
public void onClick(View view) { |
||||
if (dialogClick != null) { |
||||
dialogClick.cancel(); |
||||
} |
||||
dialog.dismiss(); |
||||
} |
||||
}); |
||||
tv_title = findViewById(R.id.tv_title); |
||||
tv_confirm = findViewById(R.id.tv_confirm); |
||||
tv_confirm.setOnClickListener(new OnClickListener() { |
||||
@Override |
||||
public void onClick(View view) { |
||||
if (dialogClick != null) { |
||||
dialogClick.confirm(); |
||||
} |
||||
dialog.dismiss(); |
||||
} |
||||
}); |
||||
tv_title = findViewById(R.id.tv_title); |
||||
tv_title.setText(title); |
||||
} |
||||
|
||||
public interface DialogClick { |
||||
void cancel(); |
||||
|
||||
void confirm(); |
||||
} |
||||
} |
@ -0,0 +1,21 @@ |
||||
package com.unionmed.unionmedtv.login.activity; |
||||
|
||||
import android.os.Bundle; |
||||
import androidx.annotation.Nullable; |
||||
import androidx.fragment.app.FragmentActivity; |
||||
|
||||
import com.unionmed.unionmedtv.R; |
||||
import com.unionmed.unionmedtv.login.activity.fragment.LoginPhoneFragment; |
||||
|
||||
public class LoginActivity extends FragmentActivity { |
||||
@Override |
||||
protected void onCreate(@Nullable Bundle savedInstanceState) { |
||||
super.onCreate(savedInstanceState); |
||||
setContentView(R.layout.activity_login); |
||||
if (savedInstanceState == null) { |
||||
getSupportFragmentManager().beginTransaction() |
||||
.replace(R.id.main_browse_fragment, new LoginPhoneFragment()) |
||||
.commitNow(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,83 @@ |
||||
package com.unionmed.unionmedtv.login.activity.fragment; |
||||
|
||||
import android.app.Dialog; |
||||
import android.os.Bundle; |
||||
import android.view.LayoutInflater; |
||||
import android.view.View; |
||||
import android.view.ViewGroup; |
||||
import android.widget.TextView; |
||||
|
||||
import androidx.fragment.app.Fragment; |
||||
|
||||
import com.lxj.xpopup.XPopup; |
||||
import com.lxj.xpopup.core.BasePopupView; |
||||
import com.lxj.xpopup.interfaces.OnConfirmListener; |
||||
import com.unionmed.unionmedtv.R; |
||||
import com.unionmed.unionmedtv.dialog.TipDialog; |
||||
|
||||
public class LoginAccountFragment extends Fragment implements View.OnClickListener { |
||||
private static final String ARG_PARAM1 = "param1"; |
||||
private static final String ARG_PARAM2 = "param2"; |
||||
|
||||
private String mParam1; |
||||
private String mParam2; |
||||
private View mRootView; |
||||
private TextView tv_scan_code_login; |
||||
|
||||
public LoginAccountFragment() { |
||||
// Required empty public constructor
|
||||
} |
||||
|
||||
public static LoginAccountFragment newInstance(String param1, String param2) { |
||||
LoginAccountFragment fragment = new LoginAccountFragment(); |
||||
Bundle args = new Bundle(); |
||||
args.putString(ARG_PARAM1, param1); |
||||
args.putString(ARG_PARAM2, param2); |
||||
fragment.setArguments(args); |
||||
return fragment; |
||||
} |
||||
|
||||
@Override |
||||
public void onCreate(Bundle savedInstanceState) { |
||||
super.onCreate(savedInstanceState); |
||||
if (getArguments() != null) { |
||||
mParam1 = getArguments().getString(ARG_PARAM1); |
||||
mParam2 = getArguments().getString(ARG_PARAM2); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, |
||||
Bundle savedInstanceState) { |
||||
if (mRootView == null) { |
||||
mRootView = inflater.inflate(R.layout.fragment_account_login, container, false); |
||||
initView(mRootView); |
||||
} |
||||
return mRootView; |
||||
} |
||||
|
||||
public void initView(View view) { |
||||
tv_scan_code_login = view.findViewById(R.id.tv_scan_code_login); |
||||
tv_scan_code_login.setOnClickListener(this); |
||||
} |
||||
|
||||
@Override |
||||
public void onClick(View view) { |
||||
if (view.getId() == R.id.tv_scan_code_login) { |
||||
// new XPopup.Builder(getContext()).isRequestFocus(true).asCustom(new TipDialog(getActivity(), "我是一个title", new TipDialog.DialogClick() {
|
||||
// @Override
|
||||
// public void cancel() {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void confirm() {
|
||||
//
|
||||
// }
|
||||
// })).show();
|
||||
getActivity().getSupportFragmentManager().beginTransaction() |
||||
.replace(R.id.main_browse_fragment, new LoginPhoneFragment()) |
||||
.commitNow(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,178 @@ |
||||
package com.unionmed.unionmedtv.login.activity.fragment; |
||||
|
||||
import android.content.Intent; |
||||
import android.os.Bundle; |
||||
import android.os.CountDownTimer; |
||||
import android.text.TextUtils; |
||||
import android.view.LayoutInflater; |
||||
import android.view.View; |
||||
import android.view.ViewGroup; |
||||
import android.widget.EditText; |
||||
import android.widget.TextView; |
||||
import android.widget.Toast; |
||||
|
||||
import androidx.fragment.app.Fragment; |
||||
|
||||
import com.hjq.http.EasyHttp; |
||||
import com.hjq.http.listener.OnHttpListener; |
||||
import com.unionmed.unionmedtv.R; |
||||
import com.unionmed.unionmedtv.activity.MainActivity; |
||||
import com.unionmed.unionmedtv.api.GetCodeApi; |
||||
import com.unionmed.unionmedtv.api.GetNearDoctorApi; |
||||
import com.unionmed.unionmedtv.api.MobileLoginApi; |
||||
import com.unionmed.unionmedtv.network.ApiResponse; |
||||
import com.unionmed.unionmedtv.network.HttpData; |
||||
import com.unionmed.unionmedtv.utils.CacheUtil; |
||||
import com.unionmed.unionmedtv.utils.ToastUtils; |
||||
|
||||
import java.util.List; |
||||
|
||||
import me.jessyan.autosize.utils.LogUtils; |
||||
|
||||
|
||||
public class LoginPhoneFragment extends Fragment implements View.OnClickListener { |
||||
private static final String ARG_PARAM1 = "param1"; |
||||
private static final String ARG_PARAM2 = "param2"; |
||||
|
||||
private String mParam1; |
||||
private String mParam2; |
||||
private View mRootView; |
||||
private TextView tv_account_login; |
||||
private EditText edit_phone; |
||||
private EditText edit_code; |
||||
private TextView tv_getVerification; |
||||
private TextView tv_login; |
||||
|
||||
public LoginPhoneFragment() { |
||||
// Required empty public constructor
|
||||
} |
||||
|
||||
public static LoginPhoneFragment newInstance(String param1, String param2) { |
||||
LoginPhoneFragment fragment = new LoginPhoneFragment(); |
||||
Bundle args = new Bundle(); |
||||
args.putString(ARG_PARAM1, param1); |
||||
args.putString(ARG_PARAM2, param2); |
||||
fragment.setArguments(args); |
||||
return fragment; |
||||
} |
||||
|
||||
@Override |
||||
public void onCreate(Bundle savedInstanceState) { |
||||
super.onCreate(savedInstanceState); |
||||
if (getArguments() != null) { |
||||
mParam1 = getArguments().getString(ARG_PARAM1); |
||||
mParam2 = getArguments().getString(ARG_PARAM2); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, |
||||
Bundle savedInstanceState) { |
||||
if (mRootView == null) { |
||||
mRootView = inflater.inflate(R.layout.fragment_phone_login, container, false); |
||||
initView(mRootView); |
||||
} |
||||
return mRootView; |
||||
} |
||||
|
||||
public void initView(View view) { |
||||
tv_account_login = view.findViewById(R.id.tv_account_login); |
||||
tv_account_login.setOnClickListener(this); |
||||
edit_phone = view.findViewById(R.id.edit_phone); |
||||
edit_code = view.findViewById(R.id.edit_code); |
||||
tv_getVerification = view.findViewById(R.id.tv_getVerification); |
||||
tv_getVerification.setOnClickListener(this); |
||||
tv_login = view.findViewById(R.id.tv_login); |
||||
tv_login.setOnClickListener(this); |
||||
} |
||||
|
||||
@Override |
||||
public void onClick(View view) { |
||||
if (view.getId() == R.id.tv_account_login) {//切换登录方式
|
||||
getActivity().getSupportFragmentManager().beginTransaction() |
||||
.replace(R.id.main_browse_fragment, new LoginAccountFragment()) |
||||
.commitNow(); |
||||
} else if (view.getId() == R.id.tv_getVerification) {//获取验证码
|
||||
if (TextUtils.isEmpty(edit_phone.getText())) { |
||||
ToastUtils.s(getActivity(), "请输入手机号"); |
||||
return; |
||||
} |
||||
getCode(edit_phone.getText().toString()); |
||||
} else if (view.getId() == R.id.tv_login) {//登录
|
||||
if (TextUtils.isEmpty(edit_phone.getText())) { |
||||
ToastUtils.s(getActivity(), "请输入手机号"); |
||||
return; |
||||
} |
||||
if (TextUtils.isEmpty(edit_code.getText())) { |
||||
ToastUtils.s(getActivity(), "请输入验证码"); |
||||
return; |
||||
} |
||||
|
||||
MobileLogin(edit_phone.getText().toString(), edit_code.getText().toString()); |
||||
} |
||||
} |
||||
|
||||
//获取验证码
|
||||
public void getCode(String phone) { |
||||
EasyHttp.post(getActivity()) |
||||
.api(new GetCodeApi(phone, 11)) |
||||
.request(new OnHttpListener<HttpData<ApiResponse<Object>>>() { |
||||
|
||||
@Override |
||||
public void onSucceed(HttpData<ApiResponse<Object>> apiResponseHttpData) { |
||||
LogUtils.e("成功:" + apiResponseHttpData); |
||||
ToastUtils.s(getActivity(), "获取验证码成功"); |
||||
if (apiResponseHttpData.getData().getCode() == 200) { |
||||
tv_getVerification.setEnabled(false); |
||||
new CountDownTimer(60 * 1000, 1000) { |
||||
@Override |
||||
public void onTick(long l) { |
||||
tv_getVerification.setText("已发送(" + (l / 1001) + ") s"); |
||||
} |
||||
|
||||
@Override |
||||
public void onFinish() { |
||||
tv_getVerification.setText("获取验证码"); |
||||
tv_getVerification.setEnabled(true); |
||||
} |
||||
}.start(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onFail(Exception e) { |
||||
ToastUtils.s(getActivity(), "获取验证码失败"); |
||||
LogUtils.e("失败:" + e); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
//手机号登录
|
||||
public void MobileLogin(String mobile, String code) { |
||||
EasyHttp.post(getActivity()) |
||||
.api(new MobileLoginApi(mobile, code)) |
||||
.request(new OnHttpListener<HttpData<ApiResponse<MobileLoginApi.TokenBean>>>() { |
||||
|
||||
@Override |
||||
public void onSucceed(HttpData<ApiResponse<MobileLoginApi.TokenBean>> apiResponseHttpData) { |
||||
LogUtils.e("成功:" + apiResponseHttpData); |
||||
if (apiResponseHttpData.getData().getCode() == 200) { |
||||
MobileLoginApi.TokenBean tokenBean=apiResponseHttpData.getData().getData(); |
||||
CacheUtil.setToken(tokenBean); |
||||
CacheUtil.setAccountNumber(tokenBean.getMobile()); |
||||
CacheUtil.saveImUserAccount(tokenBean.getIm_useraccount()); |
||||
CacheUtil.saveImUserPwd(tokenBean.getIm_password()); |
||||
CacheUtil.saveImTokenRong(tokenBean.getIm_token()); |
||||
Intent intent=new Intent(getActivity(),MainActivity.class); |
||||
getActivity().startActivity(intent); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onFail(Exception e) { |
||||
ToastUtils.s(getActivity(), "获取验证码失败"); |
||||
LogUtils.e("失败:" + e); |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,118 @@ |
||||
package com.unionmed.unionmedtv.utils; |
||||
|
||||
import android.text.TextUtils; |
||||
|
||||
import com.blankj.utilcode.util.StringUtils; |
||||
import com.google.gson.Gson; |
||||
import com.tencent.mmkv.MMKV; |
||||
import com.unionmed.unionmedtv.R; |
||||
import com.unionmed.unionmedtv.api.MobileLoginApi; |
||||
|
||||
public class CacheUtil { |
||||
private static MMKV kv = MMKV.mmkvWithID(StringUtils.getString(R.string.mmap_id)); |
||||
|
||||
/** |
||||
* 获取保存的用户信息 |
||||
*/ |
||||
public static MobileLoginApi.TokenBean getToken() { |
||||
String tokenStr = kv.decodeString(StringUtils.getString(R.string.token_id)); |
||||
if (TextUtils.isEmpty(tokenStr)) { |
||||
return null; |
||||
} else { |
||||
return new Gson().fromJson(tokenStr, MobileLoginApi.TokenBean.class); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 设置用户信息 |
||||
*/ |
||||
public static void setToken(MobileLoginApi.TokenBean token) { |
||||
if (token == null) { |
||||
kv.encode(StringUtils.getString(R.string.token_id), ""); |
||||
setIsLogin(false); |
||||
} else { |
||||
kv.encode(StringUtils.getString(R.string.token_id), new Gson().toJson(token)); |
||||
setIsLogin(true); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取保存的账号 |
||||
*/ |
||||
public static String getAccountNumber() { |
||||
return kv.decodeString(StringUtils.getString(R.string.account_number), ""); |
||||
} |
||||
|
||||
/** |
||||
* 设置账号 |
||||
*/ |
||||
public static void setAccountNumber(String account) { |
||||
if (TextUtils.isEmpty(account)) { |
||||
kv.encode(StringUtils.getString(R.string.account_number), ""); |
||||
} else { |
||||
kv.encode(StringUtils.getString(R.string.account_number), account); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 保存当前登录账号的IM账号 |
||||
*/ |
||||
public static void saveImUserAccount(String imAccount) { |
||||
if (TextUtils.isEmpty(imAccount)) { |
||||
kv.encode(StringUtils.getString(R.string.im_user_account), ""); |
||||
} else { |
||||
kv.encode(StringUtils.getString(R.string.im_user_account), imAccount); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取当前登录账号的IM账号 |
||||
*/ |
||||
public static String getImUserAccount() { |
||||
return kv.decodeString(StringUtils.getString(R.string.im_user_account), ""); |
||||
} |
||||
|
||||
/** |
||||
* 保存当前登录账号的IM账号,对应的密码 |
||||
*/ |
||||
public static void saveImUserPwd(String imPwd) { |
||||
if (TextUtils.isEmpty(imPwd)) { |
||||
kv.encode(StringUtils.getString(R.string.im_user_pwd), ""); |
||||
} else { |
||||
kv.encode(StringUtils.getString(R.string.im_user_pwd), imPwd); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取当前登录账号的IM账号,对应的密码 |
||||
*/ |
||||
public static String getImUserPwd() { |
||||
return kv.decodeString(StringUtils.getString(R.string.im_user_pwd), ""); |
||||
} |
||||
|
||||
/** |
||||
* 融云im_token |
||||
*/ |
||||
public static void saveImTokenRong(String imToken) { |
||||
if (TextUtils.isEmpty(imToken)) { |
||||
kv.encode(StringUtils.getString(R.string.im_token), ""); |
||||
} else { |
||||
kv.encode(StringUtils.getString(R.string.im_token), imToken); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取融云im_token |
||||
*/ |
||||
public static String getImTokenRong() { |
||||
return kv.decodeString(StringUtils.getString(R.string.im_token), ""); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 设置是否已经登录 |
||||
*/ |
||||
private static void setIsLogin(Boolean isLogin) { |
||||
kv.encode(StringUtils.getString(R.string.is_login), isLogin); |
||||
} |
||||
} |
@ -0,0 +1,13 @@ |
||||
package com.unionmed.unionmedtv.utils; |
||||
|
||||
import android.content.Context; |
||||
import android.widget.Toast; |
||||
|
||||
public final class ToastUtils { |
||||
public static void s(Context mContext, String s) { |
||||
if (mContext == null) { |
||||
return; |
||||
} |
||||
Toast.makeText(mContext.getApplicationContext(), s, Toast.LENGTH_SHORT).show(); |
||||
} |
||||
} |
@ -0,0 +1,143 @@ |
||||
package com.unionmed.unionmedtv.widgets; |
||||
|
||||
import android.content.Context; |
||||
import android.content.res.TypedArray; |
||||
import android.graphics.Canvas; |
||||
import android.graphics.Paint; |
||||
import android.graphics.Path; |
||||
import android.util.AttributeSet; |
||||
import android.widget.TextView; |
||||
|
||||
import com.unionmed.unionmedtv.R; |
||||
|
||||
public class CornerTextView extends TextView { |
||||
private static final float ANGEL_RIGHT_TOP = 45f; |
||||
private static final float ANGEL_LEFT_TOP = -45f; |
||||
private static final float DISTANCE_DEFAULT = 120f; |
||||
private static final float STROKE_WIDTH_DEFAULT = 0f; |
||||
private static final int CORNER_BACKGROUND_COLOR_DEFAULT = 0xFF00B94D; |
||||
//根号2
|
||||
private static final float REAGAN_TWO = (float) Math.sqrt(2); |
||||
|
||||
/** |
||||
* 显示在右上角还是左上角 |
||||
*/ |
||||
private Gravity gravity; |
||||
/** |
||||
* 有边角的距离 |
||||
*/ |
||||
private float distance = DISTANCE_DEFAULT; |
||||
/** |
||||
* 文字与色带的边距 |
||||
*/ |
||||
private float strokeWidth; |
||||
/** |
||||
* 色带颜色 |
||||
*/ |
||||
private int beltColor; |
||||
|
||||
// 文字底部到边角顶点的距离
|
||||
private float disToBottom; |
||||
Paint mBgPaint; |
||||
private Path path; |
||||
// 背景色带的高度*根号2
|
||||
private float beltHeight; |
||||
|
||||
public CornerTextView(Context context) { |
||||
super(context); |
||||
init(null, 0); |
||||
} |
||||
|
||||
public CornerTextView(Context context, AttributeSet attrs) { |
||||
super(context, attrs); |
||||
init(attrs, 0); |
||||
} |
||||
|
||||
public CornerTextView(Context context, AttributeSet attrs, int defStyle) { |
||||
super(context, attrs, defStyle); |
||||
init(attrs, defStyle); |
||||
} |
||||
|
||||
private void init(AttributeSet attrs, int defStyle) { |
||||
setGravity(android.view.Gravity.CENTER); |
||||
|
||||
final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CornerTextView, defStyle, 0); |
||||
|
||||
int gravityInt = a.getInt(R.styleable.CornerTextView_gravity, 0); |
||||
if (gravityInt == 0) { |
||||
gravity = Gravity.RIGHT_TOP; |
||||
} else { |
||||
gravity = Gravity.LEFT_TOP; |
||||
} |
||||
distance = a.getDimension(R.styleable.CornerTextView_distance, DISTANCE_DEFAULT); |
||||
strokeWidth = a.getDimension(R.styleable.CornerTextView_strokeWidth, STROKE_WIDTH_DEFAULT); |
||||
beltColor = a.getColor(R.styleable.CornerTextView_beltColor, CORNER_BACKGROUND_COLOR_DEFAULT); |
||||
|
||||
a.recycle(); |
||||
|
||||
//绘制斜条用
|
||||
mBgPaint = new Paint(); |
||||
mBgPaint.setAntiAlias(true); |
||||
mBgPaint.setColor(beltColor); |
||||
mBgPaint.setStyle(Paint.Style.FILL); |
||||
|
||||
path = new Path(); |
||||
|
||||
invalidateTextPaintAndMeasurements(); |
||||
} |
||||
|
||||
private void invalidateTextPaintAndMeasurements() { |
||||
Paint.FontMetrics fm = getPaint().getFontMetrics(); |
||||
|
||||
float mTextHeight = (float) Math.ceil(fm.bottom - fm.top); |
||||
|
||||
disToBottom = (float) (1.5 * mTextHeight + distance + strokeWidth); |
||||
beltHeight = (mTextHeight + 2 * strokeWidth) * REAGAN_TWO; |
||||
} |
||||
|
||||
@Override |
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec); |
||||
|
||||
int width = (int) (disToBottom * REAGAN_TWO); |
||||
int height = (int) (disToBottom * REAGAN_TWO); |
||||
|
||||
path.reset(); |
||||
if (gravity == Gravity.RIGHT_TOP) { |
||||
path.moveTo(0, 0); |
||||
path.lineTo(beltHeight * REAGAN_TWO, 0); |
||||
path.lineTo(width, height - beltHeight * REAGAN_TWO); |
||||
path.lineTo(width, height); |
||||
} else { |
||||
path.moveTo(0, height); |
||||
path.lineTo(0, height - beltHeight * REAGAN_TWO); |
||||
path.lineTo(width - beltHeight * REAGAN_TWO, 0); |
||||
path.lineTo(width, 0); |
||||
} |
||||
path.close(); |
||||
|
||||
setMeasuredDimension(width & MEASURED_SIZE_MASK, height & MEASURED_SIZE_MASK); |
||||
} |
||||
|
||||
@Override |
||||
protected void onDraw(Canvas canvas) { |
||||
canvas.drawPath(path, mBgPaint); |
||||
|
||||
canvas.save(); |
||||
if (gravity == Gravity.RIGHT_TOP) { |
||||
canvas.translate(beltHeight / REAGAN_TWO / 2, -beltHeight / REAGAN_TWO / 2); |
||||
canvas.rotate(ANGEL_RIGHT_TOP, this.getWidth() / 2f, this.getHeight() / 2f); |
||||
} else { |
||||
canvas.translate(-beltHeight / REAGAN_TWO / 2, -beltHeight / REAGAN_TWO / 2); |
||||
canvas.rotate(ANGEL_LEFT_TOP, this.getWidth() / 2f, this.getHeight() / 2f); |
||||
} |
||||
|
||||
super.onDraw(canvas); |
||||
|
||||
canvas.restore(); |
||||
} |
||||
|
||||
public enum Gravity { |
||||
LEFT_TOP, RIGHT_TOP |
||||
} |
||||
} |
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<selector |
||||
xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<item android:state_focused="true" android:drawable="@drawable/bg_btn_border_radius_18" /> |
||||
<item android:state_pressed="true" android:drawable="@drawable/bg_btn_50616d_radius_18" /> |
||||
<item android:state_selected="true" android:drawable="@drawable/bg_btn_50616d_radius_18" /> |
||||
<item android:drawable="@drawable/bg_btn_50616d_radius_18" /> |
||||
</selector> |
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:shape="rectangle"> |
||||
<stroke |
||||
android:width="1dp" |
||||
android:color="#50616d" /> |
||||
<corners android:radius="5dp" /> |
||||
</shape> |
@ -0,0 +1,6 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:shape="rectangle"> |
||||
<solid android:color="#4050616d"/> |
||||
<corners android:radius="18dp" /> |
||||
</shape> |
@ -0,0 +1,14 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:shape="rectangle"> |
||||
<gradient |
||||
android:angle="0" |
||||
android:endColor="#ff257a8d" |
||||
android:startColor="#ff0bbac6" |
||||
android:type="linear" /> |
||||
<corners android:radius="18dp" /> |
||||
</shape> |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,14 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:shape="rectangle"> |
||||
<gradient |
||||
android:angle="0" |
||||
android:endColor="#ff257a8d" |
||||
android:startColor="#ff0bbac6" |
||||
android:type="linear" /> |
||||
<corners android:radius="5dp" /> |
||||
</shape> |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:shape="rectangle"> |
||||
<stroke |
||||
android:width="2dp" |
||||
android:color="#5ED1FF" /> |
||||
<corners android:radius="5dp" /> |
||||
</shape> |
@ -0,0 +1,5 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> |
||||
<solid android:color="#ff50616d"/> |
||||
<corners android:radius="5dp" /> |
||||
</shape> |
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:shape="rectangle"> |
||||
<stroke |
||||
android:width="1dp" |
||||
android:color="#979797" /> |
||||
<corners android:radius="5dp" /> |
||||
</shape> |
@ -0,0 +1,9 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<solid android:color="@color/colorWhite" /> |
||||
<corners android:radius="20dp" /> |
||||
</shape> |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<selector |
||||
xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<item android:state_focused="true" android:drawable="@drawable/bg_btn_border_radius_5" /> |
||||
<item android:state_pressed="true" android:drawable="@drawable/bg_btn_50616d_border5" /> |
||||
<item android:state_selected="true" android:drawable="@drawable/bg_btn_50616d_border5" /> |
||||
<item android:drawable="@drawable/bg_btn_50616d_border5" /> |
||||
</selector> |
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<selector |
||||
xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<item android:state_focused="true" android:drawable="@drawable/bg_btn_border_radius_5" /> |
||||
<item android:state_pressed="true" android:drawable="@drawable/bg_btn_contact_visit" /> |
||||
<item android:state_selected="true" android:drawable="@drawable/bg_btn_contact_visit" /> |
||||
<item android:drawable="@drawable/bg_btn_contact_visit" /> |
||||
</selector> |
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<selector |
||||
xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<item android:state_focused="true" android:drawable="@drawable/bg_btn_c1fcff_border5" /> |
||||
<item android:state_pressed="true" android:drawable="@drawable/bg_btn_grey9_border5" /> |
||||
<item android:state_selected="true" android:drawable="@drawable/bg_btn_grey9_border5" /> |
||||
<item android:drawable="@drawable/bg_btn_grey9_border5" /> |
||||
</selector> |
After Width: | Height: | Size: 23 KiB |
@ -0,0 +1,6 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<shape |
||||
xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<solid android:color="#9A9A9A" /> |
||||
<corners android:radius="15dp" /> |
||||
</shape> |
@ -0,0 +1,12 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
xmlns:tools="http://schemas.android.com/tools" |
||||
android:id="@+id/main_browse_fragment" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="match_parent" |
||||
tools:deviceIds="tv" |
||||
tools:ignore="MergeRootFrame" > |
||||
|
||||
|
||||
|
||||
</FrameLayout> |
@ -0,0 +1,49 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="match_parent" |
||||
android:layout_marginLeft="100dp" |
||||
android:layout_marginRight="100dp" |
||||
android:background="@drawable/bg_white_border_radius_20"> |
||||
|
||||
<TextView |
||||
android:id="@+id/tv_title" |
||||
android:gravity="center" |
||||
android:textColor="#000000" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:minHeight="100dp" |
||||
android:text="我是一个测试弹窗"/> |
||||
<LinearLayout |
||||
android:layout_below="@+id/tv_title" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:layout_centerHorizontal="true" |
||||
android:layout_marginBottom="30dp" |
||||
android:orientation="horizontal"> |
||||
<TextView |
||||
android:id="@+id/tv_cancel" |
||||
android:layout_width="150dp" |
||||
android:layout_height="36dp" |
||||
android:layout_marginTop="20dp" |
||||
android:layout_marginRight="100dp" |
||||
android:background="@drawable/account_password_select" |
||||
android:focusable="true" |
||||
android:gravity="center" |
||||
android:textColor="@color/colorWhite" |
||||
android:text="取消" |
||||
android:textSize="19sp" /> |
||||
<TextView |
||||
android:id="@+id/tv_confirm" |
||||
android:layout_width="150dp" |
||||
android:layout_height="36dp" |
||||
android:layout_marginTop="20dp" |
||||
android:background="@drawable/account_password_select" |
||||
android:focusable="true" |
||||
android:gravity="center" |
||||
android:textColor="@color/colorWhite" |
||||
android:text="确定" |
||||
android:textSize="19sp" /> |
||||
</LinearLayout> |
||||
|
||||
</RelativeLayout> |
@ -0,0 +1,82 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
xmlns:tools="http://schemas.android.com/tools" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="match_parent"> |
||||
|
||||
<TextView |
||||
android:id="@+id/tv_title" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:layout_marginTop="70dp" |
||||
android:gravity="center_horizontal" |
||||
android:text="康联健康账号登录" |
||||
android:textColor="#F1F1F1" |
||||
android:textSize="24sp" /> |
||||
|
||||
<LinearLayout |
||||
android:id="@+id/lly_input" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:layout_below="@+id/tv_title" |
||||
android:layout_centerInParent="true" |
||||
android:layout_marginTop="85dp" |
||||
android:orientation="vertical"> |
||||
|
||||
|
||||
<EditText |
||||
android:id="@+id/edit_phone" |
||||
android:layout_width="290dp" |
||||
android:layout_height="50dp" |
||||
android:background="@drawable/edit_phone_select" |
||||
android:focusable="true" |
||||
android:gravity="center_vertical" |
||||
android:hint="请输入手机号码" |
||||
android:inputType="number" |
||||
android:paddingLeft="15dp" |
||||
android:textColorHint="#ffffff" |
||||
android:textSize="21sp" /> |
||||
|
||||
<EditText |
||||
android:id="@+id/edit_password" |
||||
android:layout_width="290dp" |
||||
android:layout_height="50dp" |
||||
android:layout_marginTop="20dp" |
||||
android:background="@drawable/edit_phone_select" |
||||
android:focusable="true" |
||||
android:gravity="center_vertical" |
||||
android:hint="请输入密码" |
||||
android:inputType="number" |
||||
android:paddingLeft="15dp" |
||||
android:textColorHint="#ffffff" |
||||
android:textSize="21sp" /> |
||||
|
||||
<TextView |
||||
android:id="@+id/tv_login" |
||||
android:layout_width="290dp" |
||||
android:layout_height="50dp" |
||||
android:background="@drawable/btn_select" |
||||
android:focusable="true" |
||||
android:gravity="center" |
||||
android:text="登录" |
||||
android:layout_marginTop="45dp" |
||||
android:textColor="#fff1f1f1" |
||||
android:textSize="19sp" /> |
||||
|
||||
</LinearLayout> |
||||
|
||||
|
||||
<TextView |
||||
android:id="@+id/tv_scan_code_login" |
||||
android:layout_width="150dp" |
||||
android:layout_height="36dp" |
||||
android:layout_below="@+id/lly_input" |
||||
android:layout_centerHorizontal="true" |
||||
android:layout_marginTop="50dp" |
||||
android:background="@drawable/account_password_select" |
||||
android:focusable="true" |
||||
android:gravity="center" |
||||
android:textColor="@color/colorWhite" |
||||
android:text="扫码快捷登录" |
||||
android:textSize="19sp" /> |
||||
</RelativeLayout> |
@ -0,0 +1,121 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
xmlns:tools="http://schemas.android.com/tools" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="match_parent"> |
||||
|
||||
<TextView |
||||
android:id="@+id/tv_title" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content" |
||||
android:layout_marginTop="70dp" |
||||
android:gravity="center_horizontal" |
||||
android:text="康联健康账号登录" |
||||
android:textColor="#F1F1F1" |
||||
android:textSize="24sp" /> |
||||
|
||||
<LinearLayout |
||||
android:id="@+id/lly_input" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:layout_below="@+id/tv_title" |
||||
android:layout_marginLeft="150dp" |
||||
android:layout_marginTop="85dp" |
||||
android:orientation="vertical"> |
||||
|
||||
|
||||
<EditText |
||||
android:id="@+id/edit_phone" |
||||
android:layout_width="290dp" |
||||
android:layout_height="50dp" |
||||
android:background="@drawable/edit_phone_select" |
||||
android:focusable="true" |
||||
android:gravity="center_vertical" |
||||
android:hint="请输入手机号码" |
||||
android:inputType="number" |
||||
android:paddingLeft="15dp" |
||||
android:textColorHint="#ffffff" |
||||
android:textColor="#ffffff" |
||||
android:textSize="21sp" /> |
||||
|
||||
<LinearLayout |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:layout_marginTop="30dp"> |
||||
|
||||
<EditText |
||||
android:id="@+id/edit_code" |
||||
android:layout_width="162dp" |
||||
android:layout_height="50dp" |
||||
android:layout_marginRight="10dp" |
||||
android:background="@drawable/edit_phone_select" |
||||
android:focusable="true" |
||||
android:gravity="center_vertical" |
||||
android:hint="请输入验证码" |
||||
android:inputType="number" |
||||
android:paddingLeft="15dp" |
||||
android:textColorHint="#ffffff" |
||||
android:textColor="#ffffff" |
||||
android:textSize="21sp" /> |
||||
|
||||
<TextView |
||||
android:id="@+id/tv_getVerification" |
||||
android:layout_width="116dp" |
||||
android:layout_height="50dp" |
||||
android:background="@drawable/btn_code_select" |
||||
android:focusable="true" |
||||
android:gravity="center" |
||||
android:text="获取验证码" |
||||
android:textColor="#fff1f1f1" |
||||
android:textSize="19sp" /> |
||||
</LinearLayout> |
||||
|
||||
<TextView |
||||
android:id="@+id/tv_login" |
||||
android:layout_width="290dp" |
||||
android:layout_height="50dp" |
||||
android:background="@drawable/btn_select" |
||||
android:focusable="true" |
||||
android:gravity="center" |
||||
android:text="登录" |
||||
android:layout_marginTop="45dp" |
||||
android:textColor="#fff1f1f1" |
||||
android:textSize="19sp" /> |
||||
|
||||
</LinearLayout> |
||||
|
||||
|
||||
<ImageView |
||||
android:id="@+id/iv_qrCode" |
||||
android:layout_width="206dp" |
||||
android:layout_height="206dp" |
||||
android:layout_alignTop="@+id/lly_input" |
||||
android:layout_marginLeft="214dp" |
||||
android:layout_toRightOf="@+id/lly_input" |
||||
android:src="@drawable/ic_unionmed_logo" /> |
||||
|
||||
<TextView |
||||
android:layout_width="206dp" |
||||
android:layout_height="wrap_content" |
||||
android:layout_below="@+id/iv_qrCode" |
||||
android:layout_alignLeft="@+id/iv_qrCode" |
||||
android:layout_marginTop="15dp" |
||||
android:gravity="center_horizontal" |
||||
android:text="扫描二维码登录" |
||||
android:textColor="#fff1f1f1" |
||||
android:textSize="16sp" /> |
||||
|
||||
<TextView |
||||
android:id="@+id/tv_account_login" |
||||
android:layout_width="150dp" |
||||
android:layout_height="36dp" |
||||
android:layout_below="@+id/lly_input" |
||||
android:layout_centerHorizontal="true" |
||||
android:layout_marginTop="50dp" |
||||
android:background="@drawable/account_password_select" |
||||
android:focusable="true" |
||||
android:gravity="center" |
||||
android:textColor="@color/lb_tv_white" |
||||
android:text="账号密码登录" |
||||
android:textSize="19sp" /> |
||||
</RelativeLayout> |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 6.3 KiB |
@ -0,0 +1,11 @@ |
||||
<resources> |
||||
<declare-styleable name="CornerTextView"> |
||||
<attr name="gravity" format="enum"> |
||||
<enum name="topRight" value="0"/> |
||||
<enum name="topLeft" value="1"/> |
||||
</attr> |
||||
<attr name="distance" format="dimension"/> |
||||
<attr name="strokeWidth" format="dimension"/> |
||||
<attr name="beltColor" format="color"/> |
||||
</declare-styleable> |
||||
</resources> |
Loading…
Reference in new issue