Android 仿携程购票地址互换效果
2021-05-18 本文已影响0人
Y__W
今天项目经理给了个需求,大改意思就是说,两种货币可以互相兑换的,说白了就是类似于携程购票地址切换这种效果,废话不多说上才艺:
效果:

xml布局:
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/constrainCenter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:ignore="DuplicateIds">
<include layout="@layout/a_view_actionbar" />
<LinearLayout
android:background="@drawable/huzhuan2"
android:layout_marginTop="@dimen/dp20"
android:layout_marginLeft="@dimen/dp20"
android:layout_marginRight="@dimen/dp20"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/constrainCenter"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_weight="3"
android:orientation="horizontal">
<RelativeLayout
android:layout_gravity="center"
android:gravity="center_horizontal"
android:id="@+id/constrainLayoutLeft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_centerHorizontal="true"
android:layout_gravity="center"
android:id="@+id/tvDetailStartCity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="深圳"
android:textColor="#FF222222"
android:textSize="26sp"
android:textStyle="bold" />
<TextView
android:layout_centerHorizontal="true"
android:layout_gravity="center"
android:layout_below="@+id/tvDetailStartCity"
android:id="@+id/tvDetailStartName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="宝安基地"
android:textColor="#FF222222"
android:textSize="12sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/constrainLayoutSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:padding="10dp">
<TextView
android:layout_centerHorizontal="true"
android:id="@+id/viewDetailStartEnd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@mipmap/ic_change_direction" />
</RelativeLayout>
<RelativeLayout
android:layout_gravity="center"
android:id="@+id/constrainLayoutRight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_centerHorizontal="true"
android:id="@+id/tvDetailEndCity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="深圳"
android:textColor="#FF222222"
android:textSize="26sp"
android:textStyle="bold" />
<TextView
android:layout_centerHorizontal="true"
android:layout_below="@+id/tvDetailEndCity"
android:id="@+id/tvDetailEndName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="宝安基地"
android:textColor="#FF222222"
android:textSize="12sp" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
《以下代码可以不用复制粘贴,如果粘贴了,activity代码需要全部复制,如果没有粘贴 activity中 initview可以不用复制》
<View
android:layout_marginTop="@dimen/dp10"
style="@style/line"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp" />
<LinearLayout
android:background="@drawable/huzhuan2"
android:layout_marginTop="@dimen/dp10"
android:layout_marginLeft="@dimen/dp20"
android:layout_marginRight="@dimen/dp20"
android:layout_width="match_parent"
android:layout_height="@dimen/dp40">
<LinearLayout
android:gravity="center"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:gravity="center"
android:layout_weight="1"
android:text="汇率 100 "
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:gravity="center"
android:textStyle="bold"
android:text="="
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:gravity="center"
android:layout_weight="1"
android:text="STA 10"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
</LinearLayout>
<View
android:layout_marginTop="@dimen/dp10"
style="@style/line"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp" />
<RelativeLayout
android:layout_margin="@dimen/dp40"
android:id="@+id/login_btn"
style="@style/BossGreenBtn"
android:layout_height="@dimen/dp40"
android:layout_width="match_parent">
<TextView
android:id="@+id/tv_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_weight="1"
android:gravity="center"
android:text="@string/confirm"
android:textColor="@color/white_all"
android:textSize="@dimen/sp_16_text_size" />
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/iv_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
activity:
public class ExchangeActivity extends BaseActivity {//汇兑
private ArrayList<Bean> mDatas;
private Bean bean;
RelativeLayout constrainLayoutLeft;
RelativeLayout constrainLayoutRight;
RelativeLayout constrainLayoutSwitch;
TextView tvDetailStartCity;
TextView tvDetailEndCity;
ObjectAnimator startAnimator;
ObjectAnimator endAnimator;
AnimatorSet animatorSet;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exchange);
getSupportActionBar().hide();
findViewById(R.id.iv_title_left).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
TextView tvTitle = (TextView) findViewById(R.id.tv_title_left);
tvTitle.setText("汇兑");
constrainLayoutLeft=findViewById(R.id.constrainLayoutLeft);
constrainLayoutRight=findViewById(R.id.constrainLayoutRight);
constrainLayoutSwitch=findViewById(R.id.constrainLayoutSwitch);
tvDetailStartCity=findViewById(R.id.tvDetailStartCity);
tvDetailEndCity=findViewById(R.id.tvDetailEndCity);
constrainLayoutSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
constrainLayoutSwitch.setClickable(false);
ObjectAnimator iconAnimator = ObjectAnimator.ofFloat(
constrainLayoutSwitch,
View.ROTATION,
constrainLayoutSwitch.getRotation(),
constrainLayoutSwitch.getRotation() + 180
);
int leftMargin = 0;
int rightMargin = 0;
RelativeLayout.LayoutParams leftLayoutParams = (RelativeLayout.LayoutParams) tvDetailStartCity.getLayoutParams();
leftMargin = leftLayoutParams.leftMargin;
RelativeLayout.LayoutParams rightLayoutParams = (RelativeLayout.LayoutParams) tvDetailEndCity.getLayoutParams();
rightMargin = rightLayoutParams.rightMargin;
if (constrainLayoutLeft.getTranslationX() == 0) {
startAnimator = ObjectAnimator.ofFloat(
constrainLayoutLeft,
View.TRANSLATION_X,
constrainLayoutLeft.getTranslationX(),
constrainLayoutRight.getX() + (constrainLayoutLeft.getWidth() - constrainLayoutRight.getWidth()) - leftMargin
);
endAnimator = ObjectAnimator.ofFloat(
constrainLayoutRight,
View.TRANSLATION_X,
constrainLayoutRight.getTranslationX(),
-constrainLayoutRight.getX() + rightMargin
);
} else {
startAnimator = ObjectAnimator.ofFloat(
constrainLayoutLeft,
View.TRANSLATION_X,
-constrainLayoutRight.getTranslationX(),
- constrainLayoutRight.getX() + leftMargin
);
endAnimator = ObjectAnimator.ofFloat(
constrainLayoutRight,
View.TRANSLATION_X,
constrainLayoutRight.getTranslationX(),
constrainLayoutRight.getX() - rightMargin
);
constrainLayoutLeft.setTranslationX(0);
}
animatorSet =new AnimatorSet();
animatorSet.addListener(new Animator.AnimatorListener(){
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
constrainLayoutSwitch.setClickable(true);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animatorSet.playTogether(startAnimator, endAnimator, iconAnimator);
animatorSet.setDuration(500) ;
animatorSet.start();
}
});
initview();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void initview() {
RecyclerView recycler = findViewById(R.id.iv_recycler);
mDatas = new ArrayList<>();
generateDatas();
//线性布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recycler.setLayoutManager(linearLayoutManager);
RecyclerAdapter adapter = new RecyclerAdapter(this,mDatas);
recycler.setAdapter(adapter);
}
private void generateDatas() {
for (int i = 1; i <= 100; i++) {
bean = new Bean();
bean.setImg(R.drawable.top_img);
bean.setTitle("类型"+i);
bean.setTv1("名称"+i);
bean.setTv2("费率10%"+i);
mDatas.add(bean);
}
}
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private ArrayList<Bean> mDatas;
public RecyclerAdapter(Context context, ArrayList<Bean> datas) {
mContext = context;
mDatas = datas;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false);
return new NormalHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
NormalHolder normalHolder = (NormalHolder) holder;
normalHolder.time_tv.setText(mDatas.get(position).getTv1());
normalHolder.time_tv2.setText(mDatas.get(position).getTv2());
normalHolder.title.setText(mDatas.get(position).getTitle());
normalHolder.img.setImageResource(mDatas.get(position).getImg());
}
@Override
public int getItemCount() {
return mDatas.size();
}
public class NormalHolder extends RecyclerView.ViewHolder {
public TextView time_tv;
public TextView time_tv2;
public TextView title;
public ImageView img;
public NormalHolder(View itemView) {
super(itemView);
time_tv = itemView.findViewById(R.id.time_tv);
time_tv2 = itemView.findViewById(R.id.time_tv2);
title = itemView.findViewById(R.id.title);
img = itemView.findViewById(R.id.img);
time_tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, time_tv.getText(), Toast.LENGTH_SHORT).show();
}
});
}
}
}
}
网盘链接链接: https://pan.baidu.com/s/1LvibICPh_4zr2N0VNCPIoQ 提取码: nvai