知识很基础……

前几天买了个单反,特别想拍B门长时间曝光的效果。后来想想不如自己写个APP,实现屏幕背景的随机颜色以及全屏显示文字。

先上图:

这两张图片的左侧都很亮,这是因为APP里面忘记把"状态栏"隐藏了。两张照片的快门都是30s,APP的基本功能就是设定好文字,点击屏幕就会显示一个字;再点击屏幕编程黑色;再次点击屏幕出现下一个字。我在屏幕全黑的时候移动手机,到合适位置点击屏幕,显示出下一个字。同时屏幕还能够按照设定的时间间隔,显示出随机的颜色。为了使显示的颜色更鲜艳,在RGB颜色合成的时候,RGB的随机值都是从80~255。

同时文字在显示的时候,角度从45°到135°随机出现,这要在拍照时手机正常摆放,也不至于太过呆板。

下面是APP截图:

运行时的截图:

程序代码如下:

package com.example.raw;

import java.util.Timer;
import java.util.TimerTask; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView; public class MainActivity extends Activity { public int redColor = 0;
public int blueColor = 0;
public int greenColor = 0; public int tvRedColor = 0;
public int tvBlueColor = 0;
public int tvGreenColor = 0; public int tvRotation = 0;
public int clickTimes = 0;
public int i = 0; public char[] text = null; public boolean enableView = false; private LinearLayout ll;
private TimerTask task;
private Button btnTimeInterval, btnSetText;
private TextView etTimeInterval, editSetText, tvFullScreen, tvScreenLight;
private SeekBar seekBar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setMax(100); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub } public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub } public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = (float) (progress / 100.0);
getWindow().setAttributes(lp);
}
}); ll = (LinearLayout) findViewById(R.id.root);
ll.setBackgroundColor(0XFFFFFFFF); btnTimeInterval = (Button) findViewById(R.id.btnTimeInterval);
btnSetText = (Button) findViewById(R.id.btnSetText); etTimeInterval = (TextView) findViewById(R.id.etTimeInterval);
editSetText = (TextView) findViewById(R.id.editSetText);
tvFullScreen = (TextView) findViewById(R.id.tvFullScreen);
tvScreenLight = (TextView) findViewById(R.id.tvScreenLight); final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
redColor = (int) (80 + Math.random() * 175);
blueColor = (int) (80 + Math.random() * 175);
greenColor = (int) (80 + Math.random() * 175);
ll.setBackgroundColor(0xff000000 + redColor * 255 * 255
+ blueColor * 255 + greenColor);
break;
default:
break;
}
super.handleMessage(msg);
}
}; btnTimeInterval.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try {
if (etTimeInterval.getText() != null) {
setAllUiVisibilityGone();
tvFullScreen.setVisibility(8);
Timer timer = new Timer(true);
timer.schedule(task, 1000, Integer
.parseInt(etTimeInterval.getText().toString()));
} } catch (Exception e) { } }
}); btnSetText.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try {
if (editSetText.getText() != null) {
setAllUiVisibilityGone();
text = editSetText.getText().toString().toCharArray();
tvFullScreen.setBackgroundColor(0xff000000);
ll.setBackgroundColor(0xff000000);
enableView = true;
} } catch (Exception e) {
// TODO: handle exception
}
}
}); ll.setOnClickListener(new View.OnClickListener() { public void onClick(View v) {
if (enableView == true) {
clickTimes++;
if (clickTimes % 2 == 1) {
tvFullScreen.setBackgroundColor(0xff000000);
ll.setBackgroundColor(0xff000000); tvRotation = (int) (45 + Math.random() * 90);
tvFullScreen.setRotation(tvRotation); tvRedColor = (int) (100 + Math.random() * 155);
tvBlueColor = (int) (100 + Math.random() * 155);
tvGreenColor = (int) (100 + Math.random() * 155);
tvFullScreen.setTextColor(0xff000000 + tvRedColor * 255
* 255 + tvBlueColor * 255 + tvGreenColor); if (i < text.length) {
tvFullScreen.setText(text, i++, 1);
} else {
tvFullScreen.setTextColor(0xff000000);
} } else {
tvFullScreen.setBackgroundColor(0xff000000);
tvFullScreen.setTextColor(0xff000000);
ll.setBackgroundColor(0xff000000);
}
}
}
}); task = new TimerTask() { @Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}; } public void setAllUiVisibilityGone() {
btnTimeInterval.setVisibility(8);
etTimeInterval.setVisibility(8);
btnSetText.setVisibility(8);
editSetText.setVisibility(8);
seekBar.setVisibility(8);
tvScreenLight.setVisibility(8);
}
}

MainActivity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffffff"
android:orientation="vertical"
tools:context="com.example.raw.MainActivity" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText
android:id="@+id/etTimeInterval"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:hint="输入时间间隔"
android:inputType="numberDecimal" > <requestFocus />
</EditText> <Button
android:id="@+id/btnTimeInterval"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="设定间隔" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText
android:id="@+id/editSetText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:hint="输入文字" /> <Button
android:id="@+id/btnSetText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="设定文字" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <SeekBar
android:id="@+id/seekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2" /> <TextView
android:id="@+id/tvScreenLight"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="屏幕亮度"
android:layout_weight="3"
android:gravity="center"
android:textSize="20sp"/>
</LinearLayout> <TextView
android:id="@+id/tvFullScreen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:text=""
android:textSize="280sp" /> </LinearLayout>

XML文件

19_B门长时曝光APP的更多相关文章

  1. 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast

    [源码下载] 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast 作者:webabcd 介绍背水一战 ...

  2. html中使用js实现内容过长时部分

    有时数据内容太长时我们并不希望其全部显示出来,因为这样可能会导致用于显示这些内容的标签被撑开影响美观. 这时就希望能够实现默认只显示部分内容,在鼠标放上去的时候再将全部的内容显示出来. 这里提供一个简 ...

  3. iOS设置文字过长时的显示格式

    以label为例: //设置文字过长时的显示格式 aLabel.lineBreakMode = UILineBreakModeMiddleTruncation; //截去中间 aLabel.lineB ...

  4. HTML中文本过长时自动隐藏末尾部分或中间等任意部分

    一.    一般情况下,HTML字符串过长时都会将超过的部分隐藏点,方法如下: 设置CSS: .ellipsis-type{ max-width: 50px;                      ...

  5. c# c/s 框架读取的配置文件时是app.exe.config

    c# c/s 框架读取的配置文件时是app.exe.config, 一般在bin中间中俄debug中或者Release中

  6. echarts pie 图表当名称太长时

    当饼图的名称太长时,只显示几个字符,其余的... let use; use.setOption({ tooltip: { trigger: 'item', formatter: "{a} & ...

  7. 返回xml过长时被nginx截断的解决办法

    返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...

  8. UILabel标签文字过长时的显示方式

    lineBreakMode:设置标签文字过长时的显示方式. label.lineBreakMode = NSLineBreakByCharWrapping; //以字符为显示单位显示,后面部分省略不显 ...

  9. 当td中文字过长时,显示为省略号

    当表格中的文字过长时,可选择已省略号显示.这里是用js实现的.首先获取td中的文字长度(innerText.length),如果长度超过了设定的长度,则截取内容,加上省略号显示.示例代码如下: $(f ...

随机推荐

  1. [Luogu P1613]跑路 (DP+倍增+最短路)

    题面 传送门:https://www.luogu.org/problemnew/show/P1613 Solution 挺有意思的一道题. 题面已经挺明显的描述出了这题的主要思想:倍增. 先这样想,我 ...

  2. canvas生成圆图和微信小程序canvas圆图

    先在HTML中创建 img和canvas并设置id属性 <canvas id="canvas" width="500" height="500& ...

  3. CentOS下MYSQL数据库的主从备份配置

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/limingzhong198/articl ...

  4. springboot + post 中文乱码

    去检查你的 filter 配置,是否配置了一个最高优先级的 filter, 这个最高优先级的 filter 会影响 springboot 自动配置的 CharacterEncodingFilter.原 ...

  5. SQL数据库表结构的修改(sql2005)

    一 .ALTER TABLE命令 ALTER TABLE 语句用于在已有的表中添加.修改或删除列. 二.添加列 语法 :ALTER TABLE table_name ADD column_name d ...

  6. [收藏] 传说中的12306买票插件-chrome专用

    12306.cn买票,难死了,登录登录登录... 现在不用了... js插件+chrome浏览器: /* * 12306 Auto Query => A javascript snippet t ...

  7. Docker安装Oracle11g

    为什么使用docker安装oracle,因为自己搭建配置的话可能时间太久太繁琐等等原因,也因为docker实在太方便了 本文主要是使用docker-compose安装Oracle 11g,因为使用do ...

  8. python之路《七》文件的处理

    其实我觉得python的方便之处就是简便特别是对数据的处理上 当我们要处理一些数据的时候免不了的就是要处理许多的文件那么下面就让我们来看一下文件的处理 1.打开文件 python的文件打开方式较为简单 ...

  9. Ceph数据盘怎样实现自动挂载

    前言 在Centos7 下,现在采用了 systemctl来控制服务,这个刚开始用起来可能不太习惯,不过这个服务比之前的服务控制要强大的多,可以做更多的控制,本节将来介绍下关于 Ceph的 osd 磁 ...

  10. sql实现通过父级id查询所有的子集

    通过sql实现传入父级id查询出所有的子集 最近刚好有个业务需要这样实现个功能,就是在点击查询列表详情的时候只会传入父级id,而详情得渲染出所有子集,那么做法有很多,可以直接通过代码递归查询去实现, ...