知识很基础……

前几天买了个单反,特别想拍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. elk部署(实操二)

    续上篇 https://www.cnblogs.com/wangql/p/13373022.html 安装logstash  下载地址:wget https://artifacts.elastic.c ...

  2. Java学习的第四十二天

    1.例4.7弦截法求方程f(x)=x^3-5x^2+16x-80=0的根 import java.util.Scanner; import java.lang.*; public class cjav ...

  3. [Luogu P4173]残缺的字符串 ( 数论 FFT)

    题面 传送门:洛咕 Solution 这题我写得脑壳疼,我好菜啊 好吧,我们来说正题. 这题.....emmmmmmm 显然KMP类的字符串神仙算法在这里没法用了. 那咋搞啊(或者说这题和数学有半毛钱 ...

  4. java常用类——包装类

    八种基本数据类型对应八种包装类和它们的继承关系 基本数据类型 对应的包装类 boolean Boolean byte Byte short Short int Integer long Long ch ...

  5. Markdown tricks

    编辑排版 仅仅了解 Markdown 语法还不够,知道这些 排版技巧 增色您的文章内容. 空格和空行 留白,从艺术角度上说,留白就是以"空白"为载体进而渲染出美的意境的艺术.从应用 ...

  6. 中科图新成为Bentley产品培训合作伙伴!质量服务双升级

    中科图新从2016年起开办ContextCapture产品培训,目前已累计培训了500多家企事业单位,涉及传统测绘单位.无人机航测.规划设计.建筑工程.水利.电力.交通.文保等十多个行业.实力过硬,口 ...

  7. kudu1.10基于cdh6.3.1搭建

    1.下载kudu依赖: yum -y install cyrus-sasl-plain ntp   2.下载kudu rpm包: wget https://archive.cloudera.com/c ...

  8. linux 内存泄露 valgrind

    内泄漏工具 valgrind: https://linux.die.net/man/1/valgrind www.valgrind.org/docs/manual/index.html www.val ...

  9. 使用GitHub API上传文件及GitHub做图床

    本文介绍GitHub API基础及上传文件到仓库API,并应用API将GitHub作为图床 GitHub API官方页面 GitHub API版本 当前版本为v3,官方推荐在请求头中显示添加版本标识. ...

  10. cephfs删除报nospace的问题

    ceph Vol 45 Issue 2 CephFS: No space left on device After upgrading to 10.2.3 we frequently see mess ...