android 邮箱 知乎,仿知乎登陆邮箱自动补全,邮箱补全

仿知乎登陆邮箱自动补全,邮箱补全

项目要求:

登陆界面输入邮箱,自动匹配常用邮箱并自动补全后缀。

比如邮箱为10376129@qq.com,当我输入10376129@q时,输入框自动补全后面的q.com且颜色为灰浅色,输入框失去焦点时,补全q.com颜色变为黑色,和前面103796129@q的颜色一致。

解决:

1.通过查看知乎的布局,发现没有用自定义控件,仅仅用了普通的EditText。

2.查看EditTex(继承TextView)t的API,最终想到了用下面这个方法

void android.widget.TextView.setCompoundDrawables(Drawable left,Drawable

top, Drawable right,

Drawable bottom)

通过绘制EditText右边的Drawable来显示需要自动补全的字符串

3.演示

30c39391d6f2899350473bebe9e59349.gif

1881459011be686ca240490120eeaa04.png

4.关键代码

package com.lt.autoemailactivity;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Rect;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.os.Bundle;

import android.text.Editable;

import android.text.TextWatcher;

import android.view.View;

import android.view.View.OnFocusChangeListener;

import android.widget.EditText;

public class AutoCompleteEditTextActivity extends Activity implements

TextWatcher {

/**

* 邮箱EditText

*/

private EditText mEmailEditText;

/**

* 常用的邮箱

*/

private HashMap mAutoData = new HashMap();

/**

* 邮箱editText的高度

*/

private int mHeight;

/**

* 邮箱editText的宽度

*/

private int mWidth;

/**

* 输入框中字符的baseLine

*/

private int baseLine;

/**

* 画笔

*/

private Paint mPaint;

private Bitmap mBitmap;

/**

* 画布

*/

private Canvas canvas;

private Drawable drawable;

/**

* 后缀字符串

*/

private String mAddedText = "";

/**

* 记录是否为空

*/

private boolean mFlag;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_auto_complete_edittext);

initEmail();

mEmailEditText = (EditText) findViewById(R.id.email);

mEmailEditText.addTextChangedListener(this);

mEmailEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

@Override

public void onFocusChange(View v, boolean hasFocus) {

if (!hasFocus) {

mEmailEditText.append(mAddedText);

}

}

});

}

@Override

public void beforeTextChanged(CharSequence s, int start, int count,

int after) {

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override

public void afterTextChanged(Editable s) {

String text = s.toString();

mFlag = true;

Iterator> iterator = mAutoData.entrySet()

.iterator();

// 遍历常用邮箱

while (iterator.hasNext()) {

Map.Entry entry = iterator.next();

if (text.endsWith(entry.getKey())) {

drawAddedText(entry.getValue());

mAddedText = entry.getValue();

mFlag = false;

break;

}

}

// 如果没有匹配,就画一个空

if (mFlag) {

drawAddedText("");

mAddedText = "";

}

}

/**

* 画出后缀字符串

*

* @param addedText

*/

private void drawAddedText(String addedText) {

// 如果字符串为空,画空

if (addedText.equals("")) {

mEmailEditText.setCompoundDrawables(null, null, null, null);

return;

}

// 只需要初始化一次

if (mBitmap == null) {

mHeight = mEmailEditText.getHeight();

mWidth = mEmailEditText.getWidth();

// 初始化画笔

mPaint = new Paint();

mPaint.setColor(Color.GRAY);

mPaint.setAntiAlias(true);// 去除锯齿

mPaint.setFilterBitmap(true);// 对位图进行滤波处理

mPaint.setTextSize(mEmailEditText.getTextSize());

}

// 计算baseLine

Rect rect = new Rect();

int baseLineLocation = mEmailEditText.getLineBounds(0, rect);

baseLine = baseLineLocation - rect.top;

// 添加的字符窜的长度

int addedTextWidth = (int) (mPaint.measureText(addedText) + 1);

// 创建bitmap

mBitmap = Bitmap.createBitmap(addedTextWidth, mHeight,

Bitmap.Config.ARGB_8888);

canvas = new Canvas(mBitmap);

// 绘制后缀字符串

canvas.drawText(addedText, 0, baseLine, mPaint);

// bitmap转化为Drawable

drawable = new BitmapDrawable(mBitmap);

String text = mEmailEditText.getText().toString();

// 计算后缀字符串在输入框中的位置

int addedTextLeft = (int) (mPaint.measureText(text) - mWidth + addedTextWidth);

int addedTextRight = addedTextLeft + addedTextWidth;

int addedTextTop = 0;

int addedTextBottom = addedTextTop + mHeight;

// 设置后缀字符串位置

drawable.setBounds(addedTextLeft, addedTextTop, addedTextRight,

addedTextBottom);

// 显示后缀字符串

mEmailEditText.setCompoundDrawables(null, null, drawable, null);

}

/**

* 初始化常用的邮箱

*/

private void initEmail() {

mAutoData.put("@q", "q.com");

mAutoData.put("@qq", ".com");

mAutoData.put("@qq.", "com");

mAutoData.put("@qq.c", "om");

mAutoData.put("@qq.co", "m");

mAutoData.put("@1", "63.com");

mAutoData.put("@16", "3.com");

mAutoData.put("@163", ".com");

mAutoData.put("@163.", "com");

mAutoData.put("@163.c", "om");

mAutoData.put("@163.co", "m");

mAutoData.put("@s", "ina.cn");

mAutoData.put("@si", "na.cn");

mAutoData.put("@sin", "a.cn");

mAutoData.put("@sina", ".cn");

mAutoData.put("@sina.", "cn");

mAutoData.put("@sina.c", "n");

mAutoData.put("@s", "ina.com");

mAutoData.put("@si", "na.com");

mAutoData.put("@sin", "a.com");

mAutoData.put("@sina", ".com");

mAutoData.put("@sina.", "com");

mAutoData.put("@sina.c", "om");

mAutoData.put("@sina.co", "m");

mAutoData.put("@1", "26.com");

mAutoData.put("@12", "6.com");

mAutoData.put("@126", ".com");

mAutoData.put("@126.", "com");

mAutoData.put("@126.c", "om");

mAutoData.put("@126.co", "m");

}

}

5.源码下载(有注释)

http://download.csdn.net/detail/a15501628162/8412245

http://www.dengb.com/Androidjc/951358.htmlwww.dengb.comtruehttp://www.dengb.com/Androidjc/951358.htmlTechArticle仿知乎登陆邮箱自动补全,邮箱补全 项目要求: 登陆界面输入邮箱,自动匹配常用邮箱并自动补全后缀。 比如邮箱为10376129@qq.com,当我输...

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现仿知乎滑动动画可以使用Android平台自带的ViewPager组件,通过设置页面切换时的滑动动画效果来实现。具体步骤如下: 1. 在布局文件中添加ViewPager组件。 2. 创建Fragment或者View作为ViewPager的子页面,并将其添加到ViewPager中。 3. 通过ViewPager.setAdapter方法设置ViewPager的适配器,适配器需要继承自FragmentPagerAdapter或者FragmentStatePagerAdapter类。 4. 通过ViewPager.setPageTransformer方法设置页面切换时的滑动动画,可以使用Android平台提供的一些默认动画效果,也可以自定义动画效果。 5. 最后在代码中通过ViewPager.setCurrentItem方法切换页面即可。 以下是一个简单的实现代码示例: ``` // 布局文件中添加ViewPager组件 <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent"/> // 创建Fragment或者View作为ViewPager的子页面 // 创建ViewPager适配器 public class MyPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; public MyPagerAdapter(FragmentManager fm, List<Fragment> fragmentList) { super(fm); this.fragmentList = fragmentList; } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } } // 在代码中设置ViewPager适配器和滑动动画效果 ViewPager viewPager = findViewById(R.id.viewpager); List<Fragment> fragmentList = new ArrayList<>(); fragmentList.add(new MyFragment1()); fragmentList.add(new MyFragment2()); fragmentList.add(new MyFragment3()); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), fragmentList); viewPager.setAdapter(adapter); viewPager.setPageTransformer(true, new ZoomOutPageTransformer()); // 设置滑动动画 // 自定义动画效果 public class ZoomOutPageTransformer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.85f; private static final float MIN_ALPHA = 0.5f; public void transformPage(View view, float position) { int pageWidth = view.getWidth(); int pageHeight = view.getHeight(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0f); } else if (position <= 1) { // [-1,1] // Modify the default slide transition to shrink the page as well float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); float vertMargin = pageHeight * (1 - scaleFactor) / 2; float horzMargin = pageWidth * (1 - scaleFactor) / 2; if (position < 0) { view.setTranslationX(horzMargin - vertMargin / 2); } else { view.setTranslationX(-horzMargin + vertMargin / 2); } // Scale the page down (between MIN_SCALE and 1) view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); // Fade the page relative to its size. view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0f); } } } ``` 以上就是实现仿知乎滑动动画的基本步骤和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值