精华内容
下载资源
问答
  • 模仿携程、去哪儿网日历选择,显示农历、公历,可以选择单日、双日
  • 基于Android携程结伴系统的设计.pdf
  • 二 需求分析:对于单纯的view的缩放还是比较简单的,我们使用单纯的android缩放动画就可以实现。但是按照携程首页的view来做的话,里面是有很多细节是我们需要处理的。1 对于一张图片,当我们按下然后左右滑动时它...

    一 需求:实现view的点击缩放效果,类似于携程首页。

    二 需求分析:对于单纯的view的缩放还是比较简单的,我们使用单纯的android缩放动画就可以实现。但是按照携程首页的view来做的话,里面是有很多细节是我们需要处理的。

    1 对于一张图片,当我们按下然后左右滑动时它应该仍然处于缩放状态,直到我们的手指脱离开view的边界才回到初始状态。

    2 如果说我们的view的父控件是scrollview的话,这里就需要用到android中事件分发的相关知识了。

    当我们按下view时,需要view来处理接下来的事件,但如果我们是向上或者向下滑动的话,当滑出一小段距离时,我们需要把view重置为

    初始状态,同时把事件交给scrollview来处理使其可以进行上下滑动。

    三 说了这么多,相信大家还是有点摸不着头脑的,没关系,我们先来张屏幕截图,然后我们直接贴出源码。

    运行效果:

    0818b9ca8b590ca3270a3433284dd417.png

    缩放view源码:

    package com.example.asiatravel.ctriphomescaleview.view;

    import android.animation.AnimatorSet;

    import android.animation.ObjectAnimator;

    import android.content.Context;

    import android.util.AttributeSet;

    import android.view.MotionEvent;

    import android.view.View;

    import android.view.animation.LinearInterpolator;

    import android.widget.ImageView;

    /**

    * Created by kuangxiaoguo on 16/8/30.

    */

    public class CTripHomeScaleView extends ImageView {

    /**

    * 动画持续时长

    */

    private static final int DURATION = 100;

    /**

    * 快速点击的时间间隔

    */

    private static final int TIME_DELAY = 500;

    /**

    * 滑动最小距离

    */

    private static final int MIN_MOVE_DPI = 10;

    /**

    * 缩放的scale

    */

    private static final float SMALL_SCALE = 0.95f;

    /**

    * 初始scale

    */

    private static final float ONE_SCALE = 1f;

    /**

    * 判断缩小动画有没有执行过

    */

    private boolean hasDoneAnimation;

    /**

    * 点击事件监听

    */

    private OnClickListener listener;

    /**

    * 开始动画

    */

    private AnimatorSet beginAnimatorSet;

    /**

    * scale返回动画

    */

    private AnimatorSet backAnimatorSet;

    private int downX;

    private int downY;

    private long lastClickTime;

    public CTripHomeScaleView(Context context) {

    this(context, null);

    }

    public CTripHomeScaleView(Context context, AttributeSet attrs) {

    this(context, attrs, 0);

    }

    public CTripHomeScaleView(Context context, AttributeSet attrs, int defStyleAttr) {

    super(context, attrs, defStyleAttr);

    initAnimation();

    }

    /**

    * Init scale animation

    */

    private void initAnimation() {

    ObjectAnimator beginXAnimation = ObjectAnimator.ofFloat(this, "scaleX", ONE_SCALE, SMALL_SCALE).setDuration(DURATION);

    beginXAnimation.setInterpolator(new LinearInterpolator());

    ObjectAnimator beginYAnimation = ObjectAnimator.ofFloat(this, "scaleY", ONE_SCALE, SMALL_SCALE).setDuration(DURATION);

    beginYAnimation.setInterpolator(new LinearInterpolator());

    ObjectAnimator backXAnimation = ObjectAnimator.ofFloat(this, "scaleX", SMALL_SCALE, ONE_SCALE).setDuration(DURATION);

    backXAnimation.setInterpolator(new LinearInterpolator());

    ObjectAnimator backYAnimation = ObjectAnimator.ofFloat(this, "scaleY", SMALL_SCALE, ONE_SCALE).setDuration(DURATION);

    backYAnimation.setInterpolator(new LinearInterpolator());

    beginAnimatorSet = new AnimatorSet();

    beginAnimatorSet.play(beginXAnimation).with(beginYAnimation);

    backAnimatorSet = new AnimatorSet();

    backAnimatorSet.play(backXAnimation).with(backYAnimation);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()) {

    case MotionEvent.ACTION_DOWN:

    /**

    * 判断是不是快速点击

    */

    if (isFastClick()) {

    return true;

    }

    /**

    * 请求父类不要拦截我的事件,意思是让我来处理接下来的滑动或别的事件

    */

    getParent().requestDisallowInterceptTouchEvent(true);

    downX = (int) event.getX();

    downY = (int) event.getY();

    hasDoneAnimation = false;

    post(new Runnable() {

    @Override

    public void run() {

    beginAnimatorSet.start();

    }

    });

    break;

    case MotionEvent.ACTION_MOVE:

    int moveX = (int) event.getX();

    int moveY = (int) event.getY();

    int moveDistanceX = Math.abs(moveX) - downX;

    int moveDistanceY = Math.abs(moveY) - downY;

    /**

    * 这里是判断是向左还是向右滑动,然后用view的宽度计算出一个距离compareWidth,当滑动距离超出compareWidth时,需要执行返回动画.

    */

    int compareWidth = moveDistanceX > 0 ? getWidth() - downX : downX;

    /**

    * 第一个条件:判断向上或向下滑动距离大于滑动最小距离

    * 第二个条件:判断向左或向右的滑动距离是否超出(compareWidth-最小距离)

    * 第三个条件:判断有没有执行过返回动画并在执行过一次后置为true.

    */

    if ((Math.abs(moveDistanceY) > dip2px(MIN_MOVE_DPI) || Math.abs(moveDistanceX) >= compareWidth - dip2px(MIN_MOVE_DPI)) && !hasDoneAnimation) {

    /**

    * 一 只要满足上述条件,就代表用户不是点击view,而是执行了滑动操作,这个时候我们就需要父类以及我们的最上层的控件来

    * 拦截我们的事件,让最外层控件处理接下来的事件,比如scrollview的滑动.

    * 二 因为我们执行了滑动操作,所以要执行view的返回动画

    */

    getParent().requestDisallowInterceptTouchEvent(false);

    hasDoneAnimation = true;

    post(new Runnable() {

    @Override

    public void run() {

    backAnimatorSet.start();

    }

    });

    }

    break;

    case MotionEvent.ACTION_UP:

    /**

    * 这里如果我们是单纯的点击事件就会执行

    */

    if (!hasDoneAnimation) {

    hasDoneAnimation = true;

    post(new Runnable() {

    @Override

    public void run() {

    backAnimatorSet.start();

    }

    });

    post(new Runnable() {

    @Override

    public void run() {

    /**

    * 接口回调点击事件

    */

    if (listener != null) {

    listener.onClick(CTripHomeScaleView.this);

    }

    }

    });

    }

    break;

    }

    return true;

    }

    public void setOnClickListener(OnClickListener l) {

    listener = l;

    }

    public interface OnClickListener {

    void onClick(View v);

    }

    /**

    * Make dp to px

    *

    * @param dipValue dp you need to change

    * @return Get px according to your dp value.

    */

    public int dip2px(float dipValue) {

    final float scale = getResources().getDisplayMetrics().density;

    return (int) (dipValue * scale + 0.5f);

    }

    /**

    * Judge is fast click event.

    *

    * @return Is fast click or not.

    */

    public boolean isFastClick() {

    long time = System.currentTimeMillis();

    long timeD = time - lastClickTime;

    if (timeD < TIME_DELAY) {

    return true;

    } else {

    lastClickTime = time;

    return false;

    }

    }

    }

    总结:代码量不多,主要的逻辑是在处理view的onTouch事件时,注释在代码里写的还算清晰,所以这里就不在做赘述了,不懂的童鞋可以在下面留言,或者可以发邮件:kuangxiaoguo@163.com。

    展开全文
  • android仿携程客户端界面实现

    热门讨论 2013-10-13 22:08:14
    android仿携程客户端界面实现。
  • (一)简介Handler机制是一套Android消息传递机制。在Android开发多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理。在Android开发中...

    (一)简介

    Handler机制是一套Android消息传递机制。在Android开发多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理。

    在Android开发中,为了UI操作是线程安全的,规定了只允许主线程更新Activity里的UI组件。但在实际开发中,存在多个线程并发操作UI组件的情况,导致UI操作线程不安全。故采用Handler消息传递机制,是工作线程需更新UI时,通过Handler通知主线程,从而在主线程中更新UI操作

    面试总结

    面试大厂一定要做好充分的准备,没有准备就去面试完全是去当炮灰的,更是对自己的不负责。再就是基础真的很重要,基础,基础,基础,重要的事说3遍。

    下面给大家分享下我在面试美团之前复习整理的一些面试题及解析,主要是字节跳动、阿里、腾讯、美团、拼多多等大厂常问的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖所有,不过也希望能对即将找工作的朋友起到一些帮助!

    一、Handler 相关知识

    1 、Handler Looper Message 关系是什么?

    2 、Messagequeue 的数据结构是什么?为什么要用这个数据结构?

    3 、建 如何在子线程中创建 Handler?

    4 、Handler post 方法原理?

    5 、Android 消息机制的原理及源码解析

    6、Android 消息机制

    05f0c935c6c3cb5ec176b0783c51980b.png

    二、Activity 相关

    1、Activity 四种启动模式常见使用场景

    2、onNewIntent()和 和 onConfigurationChanged()

    3、onSaveInstanceState()和 和 onRestoreInstanceState()

    4、Activity到底是如何启动的?

    5、zygote是什么?有什么作用?

    6、SystemServer是什么?有什么作用?它与zygote的关系是什么?

    7、ActivityManagerService 是什么?什么时候初始化的?有什么作用?

    1bc2479e20ed6fe0f6820420856d9dfe.png

    ###由于文章篇幅限制,不可能将所有面试题以文字形式展示出来,文中为大家精选了一些面试题,有需要的朋友们可以直接到文末领取哦。

    三、Fragment

    1 、Fragment 和 生命周期和 Activity 对比

    2 、Fragment 之间如何进行通信

    3 、Fragment 的 的 startActivityForResult

    4 、Fragment 重叠问题

    5、Fragment回退栈管理

    6、Fragment与Activity通信

    7、Fragment与ActionBar和MenuItem

    8、没有布局的Fragment—保存大量数据

    9、DialogFragment的使用

    10、Fragment的startActivityForResult

    6d8797bb3e0bfdb891447fc85e473e0c.png

    四、Service 相关

    1 、 进程保活

    2 、Service 的运行线程(生命周期方法全部在主线程)

    3 、Service 启动方式以及如何停止

    4 、ServiceConnection 里面的回调方法运行在哪个线程?

    6e6cc05e3d6cb8cd0a6f19357bc70cfc.png

    ###五、Android 布局优化之 ViewStub、include、merge

    1、用 什么情况下使用 ViewStub 、include 、merge ?

    2、他们的原理是什么?

    3、布局优化神器 include 、merge 、ViewStub标签详解

    3abf44cb6cc83c4f63ff8576880ea371.png

    六、Kotlin 相关

    1、从原理分析 Kotlin 的延迟初始化: lateinit var 和 by lazy

    2、From Java To Kotlin

    3、怎么用 Kotlin 去提高生产力:Kotlin Tips

    4、使用 Kotlin Reified 让泛型更简单安全

    5、Kotlin 里的 Extension Functions 实现原理分析

    6、Kotlin 系列之顶层函数和属性

    7、Kotlin 兼容 Java 遇到的最大的 “坑”

    8、Kotlin 的协程

    9、Kotlin 协程「挂起」的本质

    ###由于文章篇幅限制,不可能将所有面试题以文字形式展示出来,文中为大家精选了一些面试题,有需要的朋友们可以直接到文末领取哦。

    七、Flutter 相关

    1、Dart 当中的 「…」表示什么意思?

    2、Dart 的作用域

    3、Dart 是不是单线程模型?是如何运行的

    4、Dart 是如何实现多任务并行的?

    5、说一下 Dart 异步编程中的 Future 关键字?

    6、说一下 Dart 异步编程中的 Stream 数据流?

    7、Stream 有哪两种订阅模式?分别是怎么调用的?

    8、await for 如何使用?

    9、说一下 mixin 机制?

    10、请简单介绍下 Flutter 框架,以及它的优缺点?

    11、介绍下 Flutter 的理念架构

    12、介绍下 FFlutter 的 FrameWork 层和 Engine 层,以及它们的作用

    13、介绍下 Widget、State、Context 概念

    14、简述 Widget 的 StatelessWidget 和 StatefulWidget 两种状态组件类 .

    八、Java 相关

    1、HashMap

    2、 ArrayList

    3、LinkedList

    4、Hashset 源码分析

    5、内存模型

    6、垃圾回收算法(JVM)

    7、垃圾回收机制和调用 System.gc()的区别?

    8、类加载过程

    9、反射

    10、多线程和线程池

    11、HTTP、HTTPS、TCP/IP、Socket 通信、三次握手四次挥手过程

    12、设计模式(六大基本原则、项目中常用的设计模式、手写单例等)

    13、断点续传

    14、Java 四大引用

    15、Java 的泛型

    16、final、finally、finalize 的区别

    17、接口、抽象类的区别 …

    最后

    我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了5、6年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

    其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

    不断奔跑,你就知道学习的意义所在!

    9c75d848537dc4d50eb16a468524bdd8.png

    fc1642caf589f12c70692a58bafe93cc.png

    [外链图片转存中…(img-nRtKyrp5-1620467164726)]

    标签:面试题,Fragment,Kotlin,违反常规,面试,线程,UI,Android

    来源: https://blog.csdn.net/m0_57079235/article/details/116536203

    展开全文
  • 今天项目经理给了个需求,大改意思就是说,两种货币可以互相兑换的,说白了就是类似于携程购票地址切换这种效果,废话不多说上才艺:效果:图片.pngxml布局:xmlns:app=...

    今天项目经理给了个需求,大改意思就是说,两种货币可以互相兑换的,说白了就是类似于携程购票地址切换这种效果,废话不多说上才艺:

    效果:

    be67d692ce66

    图片.png

    xml布局:

    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">

    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">

    android:id="@+id/constrainCenter"

    android:layout_width="match_parent"

    android:layout_height="100dp"

    android:layout_weight="3"

    android:orientation="horizontal">

    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">

    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" />

    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" />

    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">

    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" />

    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">

    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" />

    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" />

    《以下代码可以不用复制粘贴,如果粘贴了,activity代码需要全部复制,如果没有粘贴 activity中 initview可以不用复制》

    android:layout_marginTop="@dimen/dp10"

    style="@style/line"

    android:layout_marginLeft="12dp"

    android:layout_marginRight="12dp" />

    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">

    android:gravity="center"

    android:orientation="horizontal"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    android:gravity="center"

    android:layout_weight="1"

    android:text="汇率 100 "

    android:layout_width="wrap_content"

    android:layout_height="wrap_content">

    android:gravity="center"

    android:textStyle="bold"

    android:text="="

    android:layout_weight="1"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content">

    android:gravity="center"

    android:layout_weight="1"

    android:text="STA 10"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content">

    android:layout_marginTop="@dimen/dp10"

    style="@style/line"

    android:layout_marginLeft="12dp"

    android:layout_marginRight="12dp" />

    android:layout_margin="@dimen/dp40"

    android:id="@+id/login_btn"

    style="@style/BossGreenBtn"

    android:layout_height="@dimen/dp40"

    android:layout_width="match_parent">

    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" />

    android:id="@+id/iv_recycler"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    activity:

    public class ExchangeActivity extends BaseActivity {//汇兑

    private ArrayList 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 {

    private Context mContext;

    private ArrayList mDatas;

    public RecyclerAdapter(Context context, ArrayList 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();

    }

    });

    }

    }

    }

    }

    展开全文
  • 本文实例为大家分享了android实现购票起始点位置交换的具体代码,供大家参考,具体内容如下 效果图: 点击交换位置按钮,北京和深圳布局交换位置。 xml布局文件: <?xml version=1.0 encoding=utf-8?> <...
  • android携程无线包

    2014-01-05 15:30:11
    本资源是android携程无线包,包含了携程无线手机的各种界面。
  • 【实例简介】【实例截图】【核心代码】package ...import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.util.Log;import android.view.Mot...

    【实例简介】

    【实例截图】

    d309942070f7596e21011016cb46da3b.jpg

    【核心代码】

    package com.example.xiechengdemo;

    import android.content.Context;

    import android.content.res.TypedArray;

    import android.util.AttributeSet;

    import android.util.Log;

    import android.view.MotionEvent;

    import android.view.animation.Animation;

    import android.view.animation.ScaleAnimation;

    import android.widget.FrameLayout;

    import android.widget.TextView;

    public class HomeButtonView extends FrameLayout {

    private ScaleAnimation animation_down;

    private ScaleAnimation animation_up;

    private boolean attri_doAnim;// 是否执行动画,在xml属性中可配置,默认为ture;

    private TextView textview;

    private HomeBtnOnClickListener homeBtnOnClickListener;

    public interface HomeBtnOnClickListener {

    void onClickDown(HomeButtonView homebtn);

    void onClickUp(HomeButtonView homebtn);

    }

    public void setHomeBtbOnClickListener(

    HomeBtnOnClickListener homeBtnOnClickListener) {

    this.homeBtnOnClickListener = homeBtnOnClickListener;

    }

    public HomeButtonView(Context paramContext) {

    this(paramContext, null);

    }

    public HomeButtonView(Context paramContext, AttributeSet paramAttributeSet) {

    this(paramContext, paramAttributeSet, 0);

    }

    public HomeButtonView(Context paramContext, AttributeSet paramAttributeSet,

    int paramInt) {

    super(paramContext, paramAttributeSet, paramInt);

    TypedArray localTypedArray = paramContext.obtainStyledAttributes(

    paramAttributeSet, R.styleable.home_button);

    if (localTypedArray != null) {

    // 得到xml中设置的属性值

    this.attri_doAnim = localTypedArray.getBoolean(

    R.styleable.home_button_doAnim, true);

    localTypedArray.recycle();

    }

    loadAnim();

    }

    // 设置动画

    private void loadAnim() {

    ScaleAnimation localScaleAnimation1 = new ScaleAnimation(1.0F, 0.95F,

    1.0F, 0.95F, 1, 0.5F, 1, 0.5F);

    localScaleAnimation1.setFillAfter(true);

    localScaleAnimation1.setDuration(200L);

    this.animation_down = localScaleAnimation1;

    ScaleAnimation localScaleAnimation2 = new ScaleAnimation(0.95F, 1.0F,

    0.95F, 1.0F, 1, 0.5F, 1, 0.5F);

    localScaleAnimation2.setFillAfter(true);

    localScaleAnimation2.setDuration(200L);

    this.animation_up = localScaleAnimation2;

    this.animation_up.setAnimationListener(new AnimaListen(this));

    }

    private void start_AnimDown() {

    invalidate();

    startAnimation(this.animation_down);

    }

    private void start_AnimUp() {

    invalidate();

    startAnimation(this.animation_up);

    }

    public boolean onTouchEvent(MotionEvent paramMotionEvent) {

    switch (paramMotionEvent.getAction()) {

    case MotionEvent.ACTION_DOWN:

    Log.d("cc", "HomeBtn==>ACTION_DOWN");

    if (attri_doAnim) {

    if (homeBtnOnClickListener != null) {

    homeBtnOnClickListener.onClickDown(this);

    }

    start_AnimDown();

    return true;

    }

    break;

    case MotionEvent.ACTION_MOVE:

    Log.d("cc", "HomeBtn==>ACTION_MOVE");

    break;

    case MotionEvent.ACTION_UP:

    if (homeBtnOnClickListener != null) {

    homeBtnOnClickListener.onClickUp(this);

    }

    Log.d("cc", "HomeBtn==>ACTION_UP");

    if (attri_doAnim) {

    start_AnimUp();

    return true;

    }

    break;

    default:

    break;

    }

    return true;

    }

    class AnimaListen implements Animation.AnimationListener {

    AnimaListen(HomeButtonView paramHomeButtonView) {

    }

    public void onAnimationEnd(Animation arg0) {

    }

    public void onAnimationRepeat(Animation paramAnimation) {

    }

    public void onAnimationStart(Animation paramAnimation) {

    }

    }

    }

    展开全文
  • 昨天朋友项目中有个需求让我帮忙看看怎么搞,就跟去哪儿携程买机票时点中间按钮互换出发地和目的地的效果,当时一看觉得挺简单,用补间动画,在动画完成时设置给两边各textview互换值就好,做出来后发现效果不好,在最后...
  • 马上就要下班,随便写个博客,废话不多说,直接看效果 看标题就知道了,一个日历选择,类似于去哪儿,携程,酒店预订功能 调用
  • 仿携程日历控件

    2020-12-29 18:02:16
    仿携程日历控件RecycleView实现日历列表,其中每个itemView纯cavas绘制。github地址 欢迎 start Issues支持以下功能日历选中和不可选样式行间距以及颜色设置最大可以选择多少天悬停月份展示单选和范围选择Demo单选 ...
  • 安卓Android源码——携程、去哪儿日历源码.zip
  • 安卓Android源码——携程、去哪儿日历源码.rar
  • 仿携程酒店日历接受日历组件开发之前,本来是拒绝的,日历组件,表单组件绝逼是前端开发的一个噩梦,尤其要做好一个旅游项目的日历,产品的收货标准只有一条,你看携程都实现了哦, MMP的。要在小程序中实现携程app的...
  • 一开始的思路是使用android提供的画布将布局中的内容花下来,之后想了想觉得比较麻烦,所以又开启了另外一条思路。  2.如上图“布局框架”所示。最外部是一个大布局(RelativeLayout),里面包含了两个控件(一个...
  • 干货 | 携程Android 10适配踩坑指南

    千次阅读 2020-04-09 17:02:00
    作者简介曙光,携程资深软件工程师,负责市场营销相关研发及管理工作。2019 年 9 月 3 日,Google 发布了 Android 10 正式版。Android 10 聚焦移动创新...
  • 效果图: 点击交换位置按钮,北京和深圳布局交换位置... xml布局文件: &...LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent...
  • android 日历选择,类似于去哪儿,携程,酒店预订功能 基于IDEA的项目源码。
  • RecyclerView打造价格日历(仿携程

    千次阅读 2018-06-11 15:46:34
    网上找的开源日历控件,基本是左右切换月份的模式,但我们想要的日历是上下滑动列表式,类似于携程App。于是,花点时间手动撸一个吧!- 先上个效果图:- 主要类说明:LunarDayUtil - 农历工具类SpecailDayUtil - 节...
  • Android仿酒店入住、离开时间选择Demo(仿去哪儿旅行、携程等酒店时间选择)
  • 酒店预订时选择时间日期的控件Demo,希望是你想要得东西 原地址 https://blog.csdn.net/RingoPaul/article/details/79528858 gitHub: https://github.com/AndroidJet/HotelCalendar
  • 主要为大家详细介绍了Android实现去哪儿携程地址互换效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • android 手机通讯录,携程客户端城市列表选择

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,761
精华内容 1,904
关键字:

安卓携程