本篇文章为大家展示了Android开发中如何实现一个图片中叠加文字功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
效果图:
功能:
用户自由输入内容,可手动换行,并且行满也会自动换行。
2.可拖动改变图片中文本位置(文字不会超出图片区域)。
3.点击“生成图片”按钮之后,生成一张带有文字的图片文件。
代码不多,直接全部贴上了:
Activity:
public class MainActivity extends AppCompatActivity { //图片组件 private ImageView imageView; //位于图片中的文本组件 private TextView tvInImage; //图片和文本的父组件 private View containerView; //父组件的尺寸 private float imageWidth, imageHeight, imagePositionX, imagePositionY; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image_with_text); imageView = (ImageView) findViewById(R.id.writeText_img); EditText editText = (EditText) findViewById(R.id.writeText_et); tvInImage = (TextView) findViewById(R.id.writeText_image_tv); containerView = findViewById(R.id.writeText_img_rl); imageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this); imagePositionX = imageView.getX(); imagePositionY = imageView.getY(); imageWidth = imageView.getWidth(); imageHeight = imageView.getHeight(); //设置文本大小 tvInImage.setMaxWidth((int) imageWidth); } }); imageView.setImageBitmap(getScaledBitmap(R.mipmap.test_img)); //输入框 editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.toString().equals("")) { tvInImage.setVisibility(View.INVISIBLE); } else { tvInImage.setVisibility(View.VISIBLE); tvInImage.setText(s); } } @Override public void afterTextChanged(Editable s) { } }); final GestureDetector gestureDetector = new GestureDetector(this, new SimpleGestureListenerImpl()); //移动 tvInImage.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { gestureDetector.onTouchEvent(event); return true; } }); } //确认,生成图片 public void confirm(View view) { Bitmap bm = loadBitmapFromView(containerView); String filePath = Environment.getExternalStorageDirectory() + File.separator + "image_with_text.jpg"; try { bm.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath)); Toast.makeText(this, "图片已保存至:SD卡根目录/image_with_text.jpg", Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } } //以图片形式获取View显示的内容(类似于截图) public static Bitmap loadBitmapFromView(View view) { Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); return bitmap; } private int count = 0; //tvInImage的x方向和y方向移动量 private float mDx, mDy; //移动 private class SimpleGestureListenerImpl extends GestureDetector.SimpleOnGestureListener { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //向右移动时,distanceX为负;向左移动时,distanceX为正 //向下移动时,distanceY为负;向上移动时,distanceY为正 count++; mDx -= distanceX; mDy -= distanceY; //边界检查 mDx = calPosition(imagePositionX - tvInImage.getX(), imagePositionX + imageWidth - (tvInImage.getX() + tvInImage.getWidth()), mDx); mDy = calPosition(imagePositionY - tvInImage.getY(), imagePositionY + imageHeight - (tvInImage.getY() + tvInImage.getHeight()), mDy); //控制刷新频率 if (count % 5 == 0) { tvInImage.setX(tvInImage.getX() + mDx); tvInImage.setY(tvInImage.getY() + mDy); } return true; } } //计算正确的显示位置(不能超出边界) private float calPosition(float min, float max, float current) { if (current < min) { return min; } if (current > max) { return max; } return current; } //获取压缩后的bitmap private Bitmap getScaledBitmap(int resId) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), resId, opt); opt.inSampleSize = Utility.calculateInSampleSize(opt, 600, 800); opt.inJustDecodeBounds = false; return BitmapFactory.decodeResource(getResources(), resId, opt); }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- 如何对 Java 中的 Stack 类性能进行优化?(如何优化Java中Stack类的性能)
- Java 中运算符与 C++ 相比有哪些差异?(java中运算符对比C++有何不同 )
- 在 Java 中如何通过反射获取字段的值?(java中怎么通过反射获取字段的值)
- 如何在 Java 中创建类的实例对象?(java怎么创建类的实例对象)
- 如何高效更新Uncomtrade数据库数据
- 如何在 Java 中获取端口数据?(java怎么获取端口数据)
- 如何在 Java 中实现异步处理?(java怎么实现异步处理)
- Java 写小程序都用到了哪些技术呢?(java写小程序用到的技术有哪些)
- Java 动态数据源切换的方法究竟有哪些?(java动态数据源切换的方法是什么)
- JavaScript函数式编程的亮点有哪些?(JavaScript函数式编程有啥亮点)
猜你喜欢
AI推送时光机Android开发中如何实现一个图片中叠加文字功能
后端开发2023-05-31
如何在Android中实现一个在图片中添加文字功能
后端开发2023-05-31
Android中怎么实现一个图片文字识别功能
后端开发2023-06-20
如何在Android应用中实现一个图片添加功能
后端开发2023-05-31
Android开发中怎么实现一个图片下载功能
后端开发2023-05-31
Android开发中怎么实现一个图片上传功能
后端开发2023-05-31
Android 中如何实现一个全屏图片功能
后端开发2023-05-31
Android开发中怎么实现一个长按将文章生成图片的功能
后端开发2023-05-31
Android编程实现支持拖动改变位置的图片中叠加文字功能示例
后端开发2022-06-06
如何在Android开发中中实现一个App更新功能
后端开发2023-05-31
如何在Android中利用OkHttp实现一个图片上传功能
后端开发2023-05-31
如何在Android中利用Glide实现一个图片圆角功能
后端开发2023-05-31
如何在Android中利用imageview实现一个图片缩放功能
后端开发2023-05-31
android开发中项目实现一个图片压缩功能并能指定大小
后端开发2023-05-31
Android开发中如何实现一个滑动删除功能
后端开发2023-05-31
Android开发中怎么实现一个多图展示功能
后端开发2023-05-31
Android开发中怎么实现一个全文收起功能
后端开发2023-05-31
如何在java项目中利用ocr实现一个图片文字识别功能
后端开发2023-05-31
Android开发中怎么实现一个缩略图分享功能
后端开发2023-05-31
Android开发中如何实现一个音乐播放器功能
后端开发2023-05-31
咦!没有更多了?去看看其它编程学习网 内容吧