19_B门长时曝光APP

知识很基础……

前几天买了个单反,特别想拍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文件

时间: 2024-10-11 05:58:18

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

label.lineBreakMode设置lable中文字过长时的显示格式,其中可以有末尾以省略号显示。

iOS4.0版本: label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显示,后面部分省略不显示. label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内容长度,后半部分被删除. label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字以……方式省略,显示尾部文字内容. label.lineBreakMode = NSLine

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

lineBreakMode:设置标签文字过长时的显示方式. label.lineBreakMode = NSLineBreakByCharWrapping;    //以字符为显示单位显示,后面部分省略不显示. label.lineBreakMode = NSLineBreakByClipping;        //剪切与文本宽度相同的内容长度,后半部分被删除. label.lineBreakMode = NSLineBreakByTruncatingHead;  //前面部分文字以……方式省

IOS-设计图过长时的界面设计

我们的项目设计图一般都会超出手机界面高度,如何设置呢? IOS-设计图过长时的界面设计

echarts pie 图表当名称太长时

当饼图的名称太长时,只显示几个字符,其余的... 1 let use; 2 use.setOption({ 3 tooltip: { 4 trigger: 'item', 5 formatter: "{a} <br/>{b} : {c}MB ({d}%)" 6 }, 7 series: [ 8 { 9 name: '面积模式', 10 type: 'pie', 11 radius: '60%', 12 center: ['40%', '55%'], 13 roseType:

改进的基于长时谱能量差异和基音比例的语音检测方法_爱学术

[摘要]语音检测是语音信号处理的前端,利用长时谱能量差异特征的语音检测无法区分突发噪声和语音,掺杂着突发噪声的语音信号会对语音处理系统带来不良影响.提出了一种基于长时谱能量差异特征和基音比例特征相结合的语音检测方法,该方法的优点是,在利用长时谱能量差异特征基础上引入基音比例特征,从而有效减少了将信号中突发噪声误判为语音的错误.实验显示,该算法能够在多种信噪比环境下取得很好的检测结果. [作者] 孟一鸣  欧智坚 转载至:https://www.ixueshu.com/document/07705

如何在运行时改变App的图标

在你完成应用程序的beta版本后,最后会有些人去帮你测试,使你去完善应用程序--或者会有投资青睐.但是如果测试人员有一种简单地方式去检查构建版本的应用程序会不会有帮助呢? 这个教程将会向你展示这些,向你介绍一些或许很少有人知道的Xcode里面的功能. 你会相信在这个教程中你不会写一行Swift的代码吗?当然,你也不用写一句Objective-C代码. 这个教程会让你写一些bash shell脚本.你将会使用到ImageMagick,Terminal,Xcode,去写一个自动在你的app的图标上加

[转自CocoaChina]如何在运行时改变App的图标

在你完成应用程序的beta版本后,最后会有些人去帮你测试,使你去完善应用程序--或者会有投资青睐.但是如果测试人员有一种简单地方式去检查构建版本的应用程序会不会有帮助呢? 这个教程将会向你展示这些,向你介绍一些或许很少有人知道的Xcode里面的功能. 你会相信在这个教程中你不会写一行Swift的代码吗?当然,你也不用写一句Objective-C代码. 这个教程会让你写一些bash shell脚本.你将会使用到ImageMagick,Terminal,Xcode,去写一个自动在你的app的图标上加

高并发,执行耗时短的任务,还有低并发,执行耗时长的任务,各自选取什么样的线程池比较合理?为什么?如果业务场景是高并发,且任务耗时长时,有什么解决思路?

线程池的关键点是:1.尽量减少线程切换和管理的开支: 2.最大化利用cpu.对于1,要求线程数尽量少,这样可以减少线程切换和管理的开支:对于2,要求尽量多的线程,以保证CPU资源最大化的利用. 所以对于任务耗时短的情况,要求线程尽量少,如果线程太多,有可能出现线程切换和管理的时间,大于任务执行的时间,那效率就低了:对于耗时长的任务,要分是cpu任务,还是io等类型的任务.如果是cpu类型的任务,线程数不宜太多:但是如果是io类型的任务,线程多一些更好,可以更充分利用cpu.所以:高并发,低耗时的

APP Store再陷垄断门 企业如何开发APP才保险?

不得不说iPhone作为一款优秀的产品,在十年间不断影响着我们的生活,同样也造就了一个庞大的职业"iOS 开发者";2017年,苹果公司接连收到多家国内律师事务所针对涉嫌垄断的起诉,背后的原告便是iOS开发者,作为业内知名的移动应用平台,APICloud也同样关注到此事,而随着事件不断被媒体爆出,APP  Store应用开发之痛,再次成为圈内热议话题! 起诉内容显示苹果公司运营的APP Store涉嫌职能滥用,主要包含四点表现: 拒绝交易,表现在单方面下架中国开发者软件,不给于具体的合